Java 从容器类获取限定符

Java 从容器类获取限定符,java,cdi,Java,Cdi,我想知道是否有办法指定子类应该获得容器类的限定符。例如: @Blue @Default public class Container { @Inject MyClass c; } 现在,如果我使用@Bluequalifier注入容器类,有没有办法告诉我MyClass实例也应该使用相同的限定符注入?如果不是,它要求我为每种情况创建一个生产者,并在类容器中创建一个构造函数 实现这一点的一种方法是为MyClass创建一个生产者。生产者方法必须将InjectionPoint作为参数,因

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

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

现在,如果我使用@Bluequalifier注入容器类,有没有办法告诉我MyClass实例也应该使用相同的限定符注入?如果不是,它要求我为每种情况创建一个生产者,并在类容器中创建一个构造函数

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

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

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

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

实现可以如下所示:

@可转让

@蓝色的

MyClassProducer


您是否希望将限定符从您案例中的声明类容器转移到注入的bean中?我想知道您希望用它实现什么,因为这意味着您需要为每个注入的bean提供一个用传递的限定符注释的实现。是的,当然,我需要一个生产者。所以我需要一个@Blue制作人来为我的班级服务。如果这是不可能的,我需要为每个可能的限定符声明一个容器版本。。。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Transferable {
}
@Qualifier
@Transferable
@Retention(RetentionPolicy.RUNTIME
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface Blue {
}
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
    }
}