从容器类中获取限定符

时间:2014-01-17 07:09:42

标签: java cdi

我想知道是否有办法指定子类应该获取容器类的限定符。例如:

@Blue
@Default
public class Container {
    @Inject
    MyClass c;
}

现在,如果我使用@Blue限定符注入Container类,有没有办法告诉我MyClass实例应该使用相同的限定符注入?如果没有,它需要我为每个这样的案例创建一个生成器,并在类Container中创建一个构造函数...

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是为MyClass创建一个生产者。生产者方法必须将InjectionPoint作为参数,因为我们需要有关声明类的信息。这可以通过使用InjectionPoint#getBean来实现。

有了这些信息,我们现在可以选择我们感兴趣的限定符(我建议引入一个@Transferable注释,限定符定义应该使用它更通用)。

至少生产者bean必须获得MyClass的所有可能实例。这可以通过使用实例来实现。

至少我们必须迭代实例并选择匹配的MyType实现。

实施可能如下所示:

<强> @Transferable

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Transferable {
}

<强> @Blue

@Qualifier
@Transferable
@Retention(RetentionPolicy.RUNTIME
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface Blue {
}

<强> MyClassProducer

public class MyClassProducer {
    @Inject
    private Instance<MyClass> myClasses;

    @Produces
    @Any
    public MyClass getMyClassFromTransferedAnnotations(InjectionPoint ip) {
        Set<Annotations> qualifiers  = ip.getBean().getQualifiers();
        for(Annotation an : annotations) {
            if(an.getAnnotationType().isAnnotationPresent(Transferable.class)) {
                    return myClasses.select(an.getAnnotationType);
            }
        }
        return null; // Todo : think about throwing an UnsatisfiedDependenciesException
    }
}