2017-01-18 2 views
0

내 응용 프로그램에서 클래스의 변수 그룹을 동적으로 주입해야합니다. 응용 프로그램이 커짐에 따라 동일한 인터페이스를 상속하는 클래스 만 추가하면됩니다. 이것은 tradicional java로하기 쉽습니다. 패키지의 모든 클래스를 검색하고 인스턴스화 할 루프를 수행하면됩니다. 나는 CDI에서 그것을하고 싶다. 예를 들어 :CDI : 클래스 그룹의 역동적 인 주입 방법?

public MyValidatorFactory { 
for (String className: classNames) { 
    @Inject 
    MyValidatorInterface<className> myValidatorInstance; 
    myValidatorInstance.validate(); 
} 
} 

내가 클래스 이름 목록에있는 모든 구현을 통해 루프 (모든 의지를 원하는 :

public MyValidatorInterface { 
public boolean validate(); 
} 

@Named 
MyValidator1 implements MyValidatorInterface 
... 

@Named 
MyValidator2 implements MyValidatorInterface 
... 

지금 추악한 아닌 실제 자바 코드는 내가하고 싶은 일의 아이디어를 얻을 수 있습니다 BTW와 같은 패키지에 있어야 함) 동적으로 삽입하여 다음 주에 MyValidator3이라는 새로운 유효성 검사기를 추가하면 새 클래스를 코딩하고 프로젝트에 추가해야합니다. MyValidatorFactory의 루프는 그것을 찾고, 삽입하고, 새로운 클래스에서도 validate() 메소드를 실행할 것이다.

나는 동적 주입에 대해 읽었지만 클래스 이름 그룹을 반복하고 이전 방법으로 인스턴스화하는 것처럼 주입 할 수있는 방법을 찾을 수 없습니다. 당신이 설명하는 무엇

감사

+0

CDI에 Instance''에서보세요, 이것이 당신이 찾고있는 무엇을 : 당신이 뭔가를 할 할 것 javax/enterprise/inject/Instance.html. – Rouliboy

+0

귀하의 의견을 보내 주셔서 감사합니다. 그것이 솔루션의 접근 방식이었습니다. – icordoba

답변

1

Instance<T>가하는 일입니다. 위의 예제를 들어

, 당신은 할 것 :

`@Inject Instance<MyValidatorInterface> allInstances` 

지금, allInstances 변수가 주어진 유형 (MyValidatorInterface)가 모든 콩이 포함되어 있습니다. 한정자 및/또는 Bean 클래스를 기반으로 select(..)을 호출하여 집합의 범위를 더 좁힐 수 있습니다. 이 경우 다시 Instance이 반환되지만 이전에 적합했던 콩의 하위 집합 만 있습니다. 마지막으로, 당신을 위해 빈 인스턴스를 가져 오는 get()을 호출한다.

참고 : 바로 (select없이) 위의 경우에 get()를 호출하는 경우는 지정된 형태의 두 개의 콩을 가지고 있기 때문에, 당신은 예외를 얻을 것이다 CDI 하나가 사용되어야하는 확인할 수 없습니다. 이는 유형 안전 확인 규칙에 의해 암시됩니다. Instance<T>Iterable를 구현하는

은 당신이 가장 가능성이 알고 싶은 것은 당신이 콩을 반복하는 얼마나 그래서 그건입니다. https://docs.jboss.org/cdi/api/1.0/ :

@Inject 
Instance<MyValidatorInterface> allInstances; 

public void validateAll() { 
    Iterator<MyValidatorInterface> iterator = allInstances.iterator(); 
    while (iterator.hasNext()) { 
    iterator.next().callYourValidationMethod(); 
    }} 
} 
+0

나는 그것이 그렇게 단순하지 않다고 생각했을 것이다. 이 방법으로 코딩하고 완벽하게 작동합니다. @Named 주석이 붙은 클래스를 공통 인터페이스를 상속 한 클래스에 추가하면 모두 반복기에 포함됩니다. 감사. – icordoba

+0

기꺼이 도와 드리겠습니다. – Siliarus