Java 运行时JSR-299(CDI)配置
我需要为不同的运行时环境配置不同的@Alternative、@Decorators和@Injector(想想测试、登台和生产服务器) 现在我使用maven创建了三场战争,这些战争之间的唯一区别在于beans.xml文件。有更好的方法吗?我确实有针对不同环境的@Alternative@原型,但即使这样,我也需要修改beans.xml,而且它们对@Decorators不起作用(或者它们是否起作用?) 是否可以指示CDI忽略beans.xml中的值并使用自定义配置源?因为我可以读取系统属性或其他环境变量 该应用程序只在使用Weld的容器中运行,因此特定于Weld的解决方案就可以了 我已经试过用谷歌搜索这个,但似乎找不到好的搜索词,我问了,但没有用。那边有人建议编写我自己的自定义扩展,但我找不到任何API在运行时实际更改容器配置 我认为有可能拥有某种@ApplicationScoped配置bean,并将其注入所有@Decorators,然后这些@Decorators可以自行决定它们是否应该处于活动状态,然后为了配置@Alternations write@为每个接口生成方法,并使用多个实现注入配置bean那里也有。 但在我看来,这似乎是为了复制CDI中已经存在的功能而进行的大量不必要的工作 编辑 好吧,我意识到我有点笨。。。当然,可以在运行时使用CDI扩展API添加原型和接口:Java 运行时JSR-299(CDI)配置,java,java-ee-6,cdi,jboss-weld,Java,Java Ee 6,Cdi,Jboss Weld,我需要为不同的运行时环境配置不同的@Alternative、@Decorators和@Injector(想想测试、登台和生产服务器) 现在我使用maven创建了三场战争,这些战争之间的唯一区别在于beans.xml文件。有更好的方法吗?我确实有针对不同环境的@Alternative@原型,但即使这样,我也需要修改beans.xml,而且它们对@Decorators不起作用(或者它们是否起作用?) 是否可以指示CDI忽略beans.xml中的值并使用自定义配置源?因为我可以读取系统属性或其他环境变
void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
bbd.addInterceptorBinding(...)
bbd.addStereotype(...)
}
但我没有找到添加装饰器的API。我唯一发现的是激活beans.xml中的所有@Decorators,然后观察
public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event)
如果我不希望@Decorator处于活动状态。您可能需要查看JBoss Seam,特别是焊料子项目 它允许依赖驱动的CDI解析,因此某些bean只有在其他bean或资源可用时才可用。(如果“数据源”可用,则为A类;如果“entityManager”可用,则为B类) 由于它是开源的,您还可以看看他们是如何将其连接在一起的,并在需要时将这些知识用作编写自己的扩展的基础
如果您使用的是JSF,我强烈建议您也使用SEAM-JSF,因为它摆脱了拥有两个注入框架(JSF DI/CDI)的笨拙,并允许在JSF范围内使用CDI bean。我们需要编写一个扩展来切换替代方案,这非常令人沮丧。。。
event.veto()