在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,以不同的方式生成您的 bean,功能在注入的位置和它具有什么注释。
在 Weld 参考文档中有一个很好的InjectionPoint
示例。
开发扩展
我不会在这里详细介绍,因为我不知道这是否是您的需求,但是您可以在 AfterBeanValidation 阶段在扩展中注册 bean。这些注册的 bean 可以是您想要的任何类别。如果您需要更多信息,我可以在这里开发。
使用接缝焊料(旧版(或等待 Deltaspike 0.6
Solder集成了一个配置模块,但这个项目不再维护,因为它一直在合并到Apache Deltaspike中。此合并位于 0.6 版的 Deltaspike 路线图中:http://issues.apache.org/jira/browse/DELTASPIKE-271。因此,您可以开始使用Solder配置,并在具有该功能(应该非常接近(时切换到Deltaspike。这个解决方案不是我最喜欢的,但如果你真的想有一个 Spring 的配置文件,它是最接近的解决方案
纯 CDI 提供了@Alternative
注释,例如在测试阶段通过 beans.xml
注入模拟对象,但许多模拟库做得更好,因为它们是为此而设计的。
我不知道有什么方法可以使用beans.xml
在耳朵/战争本身之外注入任何东西。