java CDI生成运行时创建的实例
我对cdi producer模式还不熟悉,到目前为止,我已经看到了一些示例,它们生成了在类的初始化点已知的简单内容。现在我必须生成一个在运行时创建的实例,并填充一些在运行时也会发生的数据。这是我目前的做法,但对我来说并不是那么好。。。有没有更好的方法,请帮我介绍一些模式和实践
public class myBean {
private DataHolder dataHolder;
@Produces
public DataHolder {
// dataHolder is null until I later init instance
return dataHolder;
}
}
在我的代码中的某个时刻,我将dataHolder设置为new istance,并通过以下操作允许进一步的注入使用运行时数据:
dataHolder = new DataHolder(data1, data2, data3);
这看起来有点傻:)有更好的办法吗?还是制作cdi的好模式
# 1 楼答案
一种方法是:
另一种方法是使用你得到的信息作为生产者方法的信息,例如注入点或你进入它的其他信息
我用最后一种方法创建了我的设备,它包含了我所需要的一切,并且不需要做任何其他事情。 有关这方面的一些资源,请访问 byteslounge.com 和 Jboss docs
编辑:我很难找到这些信息,但CDI制作人的工作方式是,您声明为参数的所有内容(例如:getCoder)都将在调用时注入。因此,您可以注入服务,帮助您在运行时收集信息
# 2 楼答案
您的方法确实很笨拙,因为如果在初始化之前的任何时候有
DataHolder
注入,它将返回null
(如果生成@Dependent
对象),甚至崩溃(使用任何其他作用域)我建议你阅读一下CDI spec或Weld doc中的生产者方法
现在,我对这件事的看法。最干净的方法是让制作人的主体每次都做所有的创作工作。这意味着:
MyBean
类中创建DataHolder
所需的参数,并从创建开始读取这些参数(生产者必须随时可以使用这些参数)如果你坚持返回
@Dependent
bean,你的制作人可以返回null
——如果你愿意,你可以利用它。然后,注入点可以预期一个可能的空值,该值可以解释为“尚未初始化”。或者,如果您需要不同的作用域(@ApplicationScoped
,@RequestScoped
,…)然后,可能更容易创建第二个DataHolder
的虚拟实现,这同样意味着“尚未实现”旁注:任何在CDI中手动创建的对象(例如使用
new
)都不会自动解析其注入点。这意味着,如果您在使用new
创建DataHolder
本身的同时,向^{DataHolder
中注入任何,就会有null