我想知道是否有一种方法可以指定子类应该获得容器类的限定符。例如:
@Blue
@Default
public class Container {
@Inject
MyClass c;
}
现在,如果我使用
@Blue
限定符注入Container类,是否有任何方法可以告诉MyClass
实例也应使用相同的限定符注入?如果不是这样,它需要我为每种情况创建一个生产器,并在类Container
中创建一个构造器... 最佳答案
实现此目的的一种方法是为MyClass创建生产者。生产者方法必须将InjectionPoint作为参数,因为我们需要有关声明类的信息。这可以通过使用InjectionPoint#getBean来实现。
有了这些信息,我们现在可以选择我们感兴趣的限定符(我建议引入一个@Transferable注解,限定符定义应使用该注解以使其更加通用)。
至少生产者bean必须获得MyClass的所有可能实例。这可以通过使用Instance来实现。
至少我们必须遍历实例并选择MyType的匹配实现。
该实现可能如下所示:
@可转让
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Transferable {
}
@蓝色
@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
}
}