使用 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