이 작업을 수행하는 한 가지 방법은 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
}
}
선언 클래스 (사례의 컨테이너)에서 삽입 된 빈까지 한정어를 전송하고 싶습니다. 나는 이것이 당신이 주입 된 각각의 빈에 대해 전송 된 한정자로 주석이 달린 구현을 필요로한다는 것을 의미하기 때문에 이것을 가지고 무엇을 달성하고 싶은지 궁금하다. – Peter
네, 물론 저는 이것들을 위해 프로듀서가 필요합니다. 그래서'MyClass'에'@ Blue' 프로듀서가 필요합니다. 이것이 가능하지 않으면 가능한 각 한정자에 대해 '컨테이너'버전을 선언해야합니다. –