gpt4 book ai didi

java - 在运行时创建的 CDI Produce 实例

转载 作者:行者123 更新时间:2023-12-02 02:55:08 25 4
gpt4 key购买 nike

我是 cdi 生产者模式的新手,到目前为止,我已经看到了生成在类的初始化点已知的简单内容的示例。现在我必须生成一个在运行时创建的实例,并填充一些也在运行时发生的数据。这是我目前的方法,但对我来说并不是那么好......有更好的方法吗,所以请帮助我解决一些模式和实践

 public class myBean {
private DataHolder dataHolder;

@Produces
public DataHolder {
// dataHolder is null until I later init instance
return dataHolder;
}
}

在我的代码中的某个时刻,我将 dataHolder 设置为新的 istance,并允许进一步注入(inject)通过执行以下操作来使用运行时数据:

dataHolder = new DataHolder(data1, data2, data3);

这看起来有点便宜:)有更好的方法吗?或者生产 cdi 东西的好模式?

最佳答案

你的方法确实很笨拙,因为如果有注入(inject)DataHolder在初始化它之前的任何时候 - 它都会返回 null (如果您生成 @Dependent 对象)甚至崩溃(使用任何其他范围)。

我建议您阅读 CDI spec 中有关 Producer 方法的内容。或Weld doc .

现在,我对此的看法。最干净的方法是让生产者工作的主体每次都完成所有创建工作。这意味着:

  1. 向生产者方法添加参数(注意:它们必须是可注入(inject)的 Bean)
  2. 具有创建 DataHolder 所需的参数在你的MyBean类自创建以来就保存并读取它们(它们必须始终可供生产者使用)
  3. 将检索这些参数所需的逻辑放入生产者方法

如果您坚持返回 @Dependent bean,你的生产者可以返回 null - 如果你愿意的话,你可以利用它。然后,注入(inject)点可能会出现一个可能的空值,该值可以解释为“尚未初始化”。或者,如果您需要不同的范围( @ApplicationScoped@RequestScoped 、...),那么创建 DataHolder 的第二个虚拟实现可能会更容易。这再次意味着“尚未实现”。

旁注:CDI 中任何手动创建的对象(例如使用 new )将不会自动解析其注入(inject)点。这意味着,如果您将任何东西注入(inject) DataHolder创建 DataHolder 时本身使用 new ,就会有null .

关于java - 在运行时创建的 CDI Produce 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43222650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com