启用 CDI 注入到由生产者方法创建的 bean

Posted

技术标签:

【中文标题】启用 CDI 注入到由生产者方法创建的 bean【英文标题】:enable CDI injection into a bean created by a producer method 【发布时间】:2013-01-07 06:47:59 【问题描述】:

生产者方法对于以编程方式创建实例并在上下文中发布它们非常有用。问题是由new 创建并由生产者方法返回的实例的所有属性都不是由CDI 注入的。在 Weld 文档中,我读到这是一种有意的行为,但在许多情况下,注入这些 bean 会非常有用。

是否有解决方法可以注入此类 bean?

【问题讨论】:

【参考方案1】:

首先,我要问你为什么要为需要注入的 bean 使用生产者。

除此之外,您需要从 BeanManager 创建一个新实例。查看https://github.com/apache/incubator-deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java#L115 的一些想法(您可以简单地将 BeanManager 作为参数注入 Producer 方法并执行相同的代码)。

【讨论】:

尊敬的 LightGuard,感谢您的回复。我会朝那个方向调查。要回答有关使用需要注入的生产者创建 bean 的问题,假设桌面(即 Swing)应用程序的框架想要公开创建视图的方法。让客户端创建这些视图的最佳方式是提供工厂接口。现在我的框架可以使用这些工厂来创建视图,但是这些视图不能使用 DI。所以我的想法是让生产者将视图暴露给 CDI,让它管理依赖注入。我认为这种行为可能很有用...... 创建 BeanProvider 就是这种情况。 要将 CDI bean 注入使用“new”创建的实例中,请使用 BeanProvider#injectFields

以上是关于启用 CDI 注入到由生产者方法创建的 bean的主要内容,如果未能解决你的问题,请参考以下文章

在 JEE 中使用生产者和具有 CDI 的多态性添加有状态 bean

哪个是 CDI @Produces 注释的 Spring 等效项?

如何以编程方式将 Java CDI 托管 bean 注入(静态)方法中的局部变量

使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean

使用 CDI/Weld 注入通用 Bean

JBoss EAP 6.2 CDI beans.xml