运行时的JSR-299(CDI)配置

时间:2011-11-15 14:16:47

标签: java java-ee-6 cdi jboss-weld

我需要为不同的运行时环境(想想测试,登台和生产服务器)配置不同的@ Alternatives,@ Decorators和@Injectors。

现在我使用maven创建三个战争,这些战争之间的唯一区别在于beans.xml文件。有一个更好的方法吗?我确实有@Alternative @Stereotypes用于不同的环境,但即便如此我还需要改变beans.xml,它们不适用于@Decorators(或者它们呢?)

是否有可能指示CDI忽略beans.xml中的值并使用自定义配置源?因为那时我可以读取系统属性或其他环境变量。

应用程序专门在使用Weld的容器中运行,因此焊接特定的解决方案就可以了。

我已经尝试谷歌这个,但似乎找不到好的搜索条件,我问Weld-Users-Forums,但无济于事。那边的人建议编写我自己的自定义扩展,但我找不到任何API来在运行时实际更改容器配置。

我认为可以使用某种@ApplicationScoped配置bean并将其注入所有@Decorator,然后可以决定它们是否应该是活动的,然后为了配置@Alternatives编写@Produces方法每个接口都有多个实现,并在那里注入配置bean。 但在我看来,基本上复制已存在于CDI中的功能有很多不必要的工作吗?

修改

好的,我意识到我有点愚蠢......当然可以在运行时使用CDI扩展API添加构造型和感知器:

void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
    bbd.addInterceptorBinding(...)
    bbd.addStereotype(...)
}

但我没有找到添加装饰器的API。我发现的唯一的事情是激活beans.xml中的所有@Decorators,然后观察

public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event)

并致电

event.veto()

如果我不想让@Decorator处于活动状态。

1 个答案:

答案 0 :(得分:1)

你可能想看看JBoss Seam,特别是Solder子项目。

它允许依赖性驱动的CDI解析,因此某些bean仅在其他bean或资源可用时才可用。 (如果“dataSource”可用,则为A类;如果“entityManager”可用,则为B类)

由于它是开源的,您还可以查看它们如何将它们连接在一起,并根据需要使用该知识作为编写您自己的扩展的基础。

如果你正在使用JSF,我强烈建议使用SEAM-JSF,因为它摆脱了拥有两个注入框架(JSF DI / CDI)的笨拙,并允许在JSF范围内使用CDI bean。