CDI - 生产者和限定符不在生产的对象上

Posted

技术标签:

【中文标题】CDI - 生产者和限定符不在生产的对象上【英文标题】:CDI - Producers and Qualifiers not on the produced object 【发布时间】:2015-09-09 13:17:37 【问题描述】:

想象有一个 SessionFactory 的生产者(例如):

@Produces public SessionFactory produceSessionFactory()

不,我有第二个生产者,它产生一些其他对象,比如说一个 DatabaseObject,并且需要一个对 SessionFactory 的引用:

@Produces
public DatabaseObject produceDatabaseObject(SessionFactory factory)

不,我可以这样使用我的数据库对象:

@Inject
DatabaseObject object;

到目前为止,一切都很好。所以让我们假设这些东西是在一个框架中实现的,并且将被多个应用程序使用。

现在一个应用程序决定要使用另一个 SessionFactory,所以它实现了自己的生产者和限定符:

@Produces 
@CustomQualifier
public SessionFactory produceSessionFactory()

但现在,据我所知,我不能将 DatabaseObject 与限定符一起使用,因为 - 当然 - 限定符只是在 SessionFactory 的生产者处使用。所以这行不通:

@Inject
@CustomQualifier
DatabaseObject object;

因此,应用程序将不得不重新实现 DatabaseObject 生产者,拥有完全相同的代码,或者扩展基本生产者并仅添加限定符:

@Produces
@CustomQualifier
public DatabaseObject produceDatabaseObject(@CustomQualifier SessionFactory factory)
    return super.produceDatabaseObject(factory);

从我的角度来看,这会以某种方式产生样板代码,如果你有很多生产者,这会很有趣。

有没有办法在不需要重新实现生产者的情况下实现这一点?所以基本上生产者方法被注入了关于它产生的对象上的限定符的 SessionFactory?

谢谢!

【问题讨论】:

【参考方案1】:

您可以在生产者中使用InjectionPoint 来检索限定符并创建适当的实例(例如,请参阅https://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_the_literal_injectionpoint_literal_object)。

或者,创建一个可移植的扩展程序。通过这样做,您可以注册/创建自己的 bean。为几个 bean 创建扩展可能成本太高而收益太少,但请看这里:https://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#_registering_a_literal_bean_literal

【讨论】:

但是注入点并不能解决问题,因为我仍然需要实现相应的生产者。否则我会在启动验证阶段得到一个不满足的依赖错误?因此,我需要提供第二个非限定符注释,其中包含 SessionFactory 限定符作为非绑定类参数。这对我认为的“用户”来说有点奇怪..

以上是关于CDI - 生产者和限定符不在生产的对象上的主要内容,如果未能解决你的问题,请参考以下文章

CDI Features

EJB 的 CDI 生产者

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

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

《C专家编程》---不知道的那些事

cdi bean 中的资源注入