[英]CDI: Injecting resources to beans from external libraries
在Spring中,我们具有基于注释和基于XML的配置。 虽然推荐使用第一种,以便快速开发,但是第二种更灵活,并且能够处理特殊情况。 目前,我们有2个:为JUnit测试注入模拟并从外部库配置Bean。
我还没有找到CDI的XML配置的等效项,所以我的问题是,如何处理此类bean的依赖项注入? 它们来自外部库,需要进行配置,并且无法向其中添加任何注释。
您可以根据需要提供三种解决方案:
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参考文档中,您有一个不错的InjectionPoint
示例。
由于不知道您是否需要它,因此在此不做详细介绍,但是您可以在AfterBeanValidation阶段的扩展中注册bean。 这些注册的bean可以是您想要的任何类。 如果您需要更多信息,我可以在这里进行开发。
Solder集成了一个配置模块,但是由于该项目已经在Apache Deltaspike中进行合并,因此不再维护该项目。 这次合并在Deltaspike路线图的0.6版中: http ://issues.apache.org/jira/browse/DELTASPIKE-271。 因此,您可以开始使用Solder config并在它具有功能时切换到Deltaspike(应该非常接近)。 这个解决方案不是我的最爱,但是如果您真的想在Spring中使用配置文件,那是最接近的解决方案
Pure CDI提供了@Alternative
批注,以便在测试阶段通过beans.xml
注入例如模拟对象,但是许多模拟库由于为它们而设计,因此效果更好。
我不知道使用beans.xml
在耳朵/战争本身之外注入任何东西的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.