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 - 生产者和限定符不在生产的对象上的主要内容,如果未能解决你的问题,请参考以下文章