在 Spring 中,我们有基于注解和基于 XML 的配置。虽然第一个建议用于快速开发,但第二个更灵活并且能够处理特殊情况。我们目前有 2 个:为 JUnit 测试注入模拟和从外部库配置 bean。
我还没有找到 CDI 的 XML 配置的任何等效项,所以我的问题是,如何处理此类 bean 的依赖注入?它们来自外部库,需要对其进行配置,并且不可能向它们添加任何注释。
在 Spring 中,我们有基于注解和基于 XML 的配置。虽然第一个建议用于快速开发,但第二个更灵活并且能够处理特殊情况。我们目前有 2 个:为 JUnit 测试注入模拟和从外部库配置 bean。
我还没有找到 CDI 的 XML 配置的任何等效项,所以我的问题是,如何处理此类 bean 的依赖注入?它们来自外部库,需要对其进行配置,并且不可能向它们添加任何注释。
您有三种解决方案来满足您的需求:
CDI 提供了一种在 bean 中转换非 CDI 类的方法。它被称为生产者。如果你想从一个名为NonCdiClass
You 的类创建一个 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 配置并在具有该功能时切换到 Deltaspike(应该非常接近)。这个解决方案不是我最喜欢的,但如果你真的想要一个配置文件 à la Spring,它是最接近的解决方案
纯 CDI 提供@Alternative
注解以在测试阶段通过 注入例如模拟对象beans.xml
,但许多模拟库做得更好,因为它们是为它设计的。
我不知道有一种方法可以beans.xml
在耳朵/战争本身之外注入任何东西。