使用CDI实例化对象列表

时间:2015-08-19 13:47:59

标签: java-8 cdi weld

我目前正在重构一些遗留代码,并遇到如下代码段。 如何避免“CompanyAuditor”类的实例化并使用CDI来处理它?<​​/ p>

return compDAO.getAll()
                .stream()
                .map( CompanyAuditor::new )
                .collect( Collectors.toList() );

1 个答案:

答案 0 :(得分:1)

唯一的方法是为CompanyAuditor定义不带参数的构造函数,使用javax.enterprise.inject.Instance.get创建新实例。然后使用公共方法传递所有参数。因此,带有参数的构造函数必须分为没有参数的构造函数和用于设置此参数的其他公共方法。此外,您必须编写自己的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