在Spring中,我们有基于注释和基于XML的配置。虽然第一个建议用于快速开发,但第二个更灵活,能够处理特殊情况。我们目前有2个:为JUnit测试注入模拟和从外部库配置bean。
我没有找到CDI的XML配置的任何等价物,所以我的问题是,如何处理这种bean的依赖注入?它们来自外部库,需要进行配置,并且不可能向它们添加任何注释。
答案 0 :(得分:4)
您有三种解决方案可以满足您的需求:
CDI提供了一种转换bean中非CDI类的方法。它被称为生产者。如果要从名为NonCdiClass
的类创建bean,则只需创建类似
public class MyProducers {
@Produces
public NonCdiClass produceNonCdiClass() {
return new NonCdiClass();
};
}
}
现在,您可以在需要时@Inject
使用此bean。
您可以在班级中添加任意数量的制作人方法。
如果你需要在你生产的bean中模拟注入,你可以通过在生成器方法调用中注入参数的CDI来完成它。
@Produces
public NonCdiClass produceNonCdiClass(MyFisrtBean param1, MySecondBean param2) {
NonCdiClass res = new NonCdiClass(param1);
res.setParam(param2);
return res;
};
}
在此示例中,MyFirstBean
和MySecondBean
是现有的bean类,将在生产时由CDI注入。
生产者也可以拥有限定符(在他们或他们的参数上)或者注入InjectionPoint
这是一个CDI内部bean,允许你根据注入的位置和注释的位置来生成你的bean。
Weld reference documentation中有一个很好的InjectionPoint
示例。
我不会在这里详细介绍,因为我不知道这是否是您的需要,但您可以在AfterBeanValidation阶段的扩展中注册bean。这些注册的bean可以是您想要的任何类。 如果您需要我可以在这里开发的更多信息。
Solder集成了一个config module,但是这个项目不再需要维护,因为它已经在Apache Deltaspike中合并了。此合并是在版本0.6的Deltaspike路线图中:http://issues.apache.org/jira/browse/DELTASPIKE-271。因此,您可以开始使用Solder配置并切换到Deltaspike,因为它具有该功能(应该非常接近)。 这个解决方案不是我最喜欢的,但是如果你真的想要一个配置文件,那么它就是最接近的解决方案
答案 1 :(得分:1)
Pure CDI提供了@Alternative
注释,以便在测试阶段通过beans.xml
注入模拟对象,但是许多模拟库做得更好,因为它们是为它设计的。
我不知道如何使用beans.xml
在耳朵/战争本身之外注射任何东西。