使用 CDI 实例化对象列表
Instantiate list of objects with CDI
我目前正在重构一些遗留代码并遇到如下片段。
如何避免 'CompanyAuditor' class 的实例化并使用 CDI 来处理它?
return compDAO.getAll()
.stream()
.map( CompanyAuditor::new )
.collect( Collectors.toList() );
唯一的方法是为 CompanyAuditor 定义不带参数的构造函数,使用 javax.enterprise.inject.Instance.get 创建新实例。然后使用 public 方法传递所有参数。因此,必须将带参数的构造函数分成一个不带参数的构造函数和附加 public 方法来设置此参数。此外,您必须编写自己的 lambda 表达式,这比 CompanyAuditor::new.
更复杂
完整示例:
@Inject
@New // javax.enterprise.inject.New to always request a new object
private Instance<CompanyAuditor> auditorInjector;
public List returnAllWrappedAuditors() {
return compDAO.getAll()
.stream()
.map( ca -> {
CompanyAuditor auditor = auditorInjector.get();
auditor.setWrappedObject( ca );
return auditor;
})
.collect( Collectors.toList());
}
后记:
CDI 在动态构造对象时不是很容易使用,它擅长注入依赖项。因此它比调用构造函数来创建新对象更冗长。
CDI bean 必须具有不带参数的构造函数或使用@Inject 注释的所有参数(这对您的情况没有帮助)See Java EE 7 tutorial
我目前正在重构一些遗留代码并遇到如下片段。 如何避免 'CompanyAuditor' class 的实例化并使用 CDI 来处理它?
return compDAO.getAll()
.stream()
.map( CompanyAuditor::new )
.collect( Collectors.toList() );
唯一的方法是为 CompanyAuditor 定义不带参数的构造函数,使用 javax.enterprise.inject.Instance.get 创建新实例。然后使用 public 方法传递所有参数。因此,必须将带参数的构造函数分成一个不带参数的构造函数和附加 public 方法来设置此参数。此外,您必须编写自己的 lambda 表达式,这比 CompanyAuditor::new.
更复杂完整示例:
@Inject
@New // javax.enterprise.inject.New to always request a new object
private Instance<CompanyAuditor> auditorInjector;
public List returnAllWrappedAuditors() {
return compDAO.getAll()
.stream()
.map( ca -> {
CompanyAuditor auditor = auditorInjector.get();
auditor.setWrappedObject( ca );
return auditor;
})
.collect( Collectors.toList());
}
后记:
CDI 在动态构造对象时不是很容易使用,它擅长注入依赖项。因此它比调用构造函数来创建新对象更冗长。
CDI bean 必须具有不带参数的构造函数或使用@Inject 注释的所有参数(这对您的情况没有帮助)See Java EE 7 tutorial