2014-01-17 2 views
0

하위 클래스가 컨테이너 클래스의 한정자를 가져 오도록 지정하는 방법이 있는지 궁금합니다. 예를 들면 :컨테이너 클래스에서 한정자 가져 오기

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

나는 @Blue 한정자를 사용하여 컨테이너 클래스를 주입하면 이제도 MyClass 인스턴스가 같은 한정자를 사용하여 주입되어야 함을 알 수있는 방법이있다? 그렇지 않다면 각각의 경우에 대해 프로듀서를 생성하고 클래스의 생성자를 생성해야합니다. Container ...

+0

선언 클래스 (사례의 컨테이너)에서 삽입 된 빈까지 한정어를 전송하고 싶습니다. 나는 이것이 당신이 주입 된 각각의 빈에 대해 전송 된 한정자로 주석이 달린 구현을 필요로한다는 것을 의미하기 때문에 이것을 가지고 무엇을 달성하고 싶은지 궁금하다. – Peter

+0

네, 물론 저는 이것들을 위해 프로듀서가 필요합니다. 그래서'MyClass'에'@ Blue' 프로듀서가 필요합니다. 이것이 가능하지 않으면 가능한 각 한정자에 대해 '컨테이너'버전을 선언해야합니다. –

답변

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 
    } 
} 
관련 문제