0

想象一下有一个 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?

谢谢!

4

1 回答 1

0

您可以在生产者中使用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

于 2015-06-23T19:04:24.157 回答