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

时间:2015-06-23 16:03:24

标签: java cdi qualifiers producer

想象一下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 个答案:

答案 0 :(得分: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