gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:07 25 4
gpt4 key购买 nike

我需要为不同的运行时环境(考虑测试、暂存和生产服务器)配置不同的@Alternatives、@Decorators 和@Injectors。

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

是否可以通过某种方式指示 CDI 忽略 beans.xml 中的值并使用自定义配置源?因为这样我就可以读取系统属性或其他环境变量。

该应用程序仅在使用 Weld 的容器中运行,因此可以使用特定于 weld 的解决方案。

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

我认为有可能有某种@ApplicationScoped 配置bean 并将其注入(inject)所有@Decorators,然后它们可以自行决定它们是否应该处于 Activity 状态,然后为了配置@Alternatives 编写@Produces 方法每个接口(interface)都有多个实现,并在那里注入(inject)配置 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 处于 Activity 状态。

最佳答案

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

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

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

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

关于java - 运行时的 JSR-299 (CDI) 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8137696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com