2017-03-01 4 views
1

하위 클래스의 유형에 따라 CDI를 사용하여 필드를 주입하려는 클래스 계층 구조가 있습니다. 이러한 상황은 자바 코드 다음에 설명되어 있습니다 :CDI : 객체 클래스 기반 주입

@Stateless 
public class A { 
    @Inject 
    @MyInjection 
    D d; 
    ... 
    public void templateMethod(){...}; 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

@Stateless 
public class B extends A { 
... 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

@Stateless 
public class C extends A { 
... 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

public class F { 

    @Produces 
    @MyInjection 
    D myProducer(InjectionPoint ip){ 
     Class<?> clazz = ip.getMember().getDeclaringClass(); 

     //if clazz is B then inject one type 

     //if clazz is C then inject other type 

     //default inject default type 
    } 
} 

이 콩 EAR의 일부로서 적절한 ejb.jar 아카이브를 포장하고 적절한 장소에 beans.xml 환경 파일이 있습니다. 이 코드는 Java EE 7을 사용하여 Wildfly 10 서버에서 실행됩니다. 필드는 다음과 같이 논리적으로 생각할 때 클래스 기본 클래스 (이 경우 클래스 A)를 가져옵니다.이 코드를 사용하면이 코드를 사용할 수 있습니다. 실제로 클래스 A에 있습니다. 요점은 내가 수퍼 클래스에 주입하더라도 하위 클래스를 기반으로 구별을하고 싶습니다.

InjectionPoint 클래스를 사용하여이를 수행 할 수 있습니까? 이것을 달성 할 수있는 방법이 있습니까?

이 코드에 대해 더 자세히 설명해 드리겠습니다. 이 계층 구조는 템플릿 패턴 디자인 패턴을 구현하며 모든 클래스는 구체적입니다. 일반 알고리즘 및 특정 단계를 구현하는 클래스 A를 사용할 수 있지만 일부 하위 클래스의 단계를 재정의하도록 선택할 수 없습니다. 또한 sublclass에 따라 다를 수있는 특정 유형 D를 주입 할 필요가 있습니다.

저음 클래스 A를 재 설계하지 않으려는 열망이 있습니다. 그래서 저는 CDI를 사용하고 배포 설명자를 사용하지 않고 기본 클래스에 무언가를 주입하는 방법을 찾고자합니다.

+0

귀하의 질문에 모두 언급 했으니 –

답변

1

귀하의 질문에 나는 당신이 무엇을 결정하고자하는 것을 이해했습니다 을 주사하고 있습니다. 이것은 다음과 같은 방법으로 달성 될 수있다 :

@Produces 
@MyInjection 
D myProducer(InjectionPoint ip){ 
    // this will give you the class of the bean you injected into 
    ip.getBean().getBeanClass(); 
} 

는 완성도를 들어, 이전 솔루션 (필드 생산자 또는 Field)을 Method 객체를 반환 ip.getMember()을 사용했다. 따라서 getDeclaringClass()으로 전화하면 class A이됩니다.

+0

답변을 주셔서 감사합니다. 그러나 unfortunenatelly ip.getBean()은 null을 반환합니다. 당분간 그것은 나를위한 퍼즐입니다. –

+0

null을 반환 하시겠습니까? 음, 아마도 콩에 "잘못된"범위가 있다는 뜻입니다. 왜냐하면'InjectionPoint'는'@ Dependent' 빈으로 주입하는 경우에만 작동하기 때문입니다 (자세한 내용은 [here] (http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#injection_point)를 읽으십시오). 'A','B' 및'C' 콩의 범위는 무엇입니까? – Siliarus

+0

나는 그것이'@ Dependent'라고 믿는다. 내가 아는 한 bean에 주석을 달지 않으면'@ Dependent'가 기본 범위입니다. 내가 잘못? –

0

약간의 조작을 한 후에 내 질문에 명시된 행동을 달성하는 방법을 찾았습니다. 이것은 CDI 주입에 대한 다른 접근법을 필요로했습니다. 현장 주입 대신 생성자 주입이 작업을 수행했습니다. 코드를 나는 잎 클래스를 기반으로 주입을 구별 할 수 있어요 이런 식으로 정리

public class A { 
    D d; 
    ... 

    public A(){ 
     this.d = null; 
    } 

    @Inject 
    public A(@MyInjection D d){ 
     this.d = d; 
    } 
    ... 
    public void templateMethod(){...}; 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

@Stateless 
public class B extends A { 
    ... 
    public B(){ 
     super(); 
    } 

    @Inject 
    public B(@MyInjection D d){ 
     super(d); 
    } 
    ... 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

@Stateless 
public class C extends A { 
    ... 
    public B(){ 
     super(); 
    } 

    @Inject 
    public B(@MyInjection D d){ 
     super(d); 
    } 
    ... 
    protected void step1(){...}; 
    protected void step2(){...}; 
} 

public class F { 

    @Produces 
    @MyInjection 
    D myProducer(InjectionPoint ip){ 
     Class<?> clazz = ip.getMember().getDeclaringClass(); 

     //if clazz is B then inject one type 

     //if clazz is C then inject other type 

     //default inject default type 
    } 
} 

, 기본 클래스 (하는 API의 일부)의 코드를 변경하지의 요구 사항을 달성 할 수 없을 수도 있지만.