2012-08-07 4 views
2

런타임에 객체를 삽입하려면 어떻게합니까? 예를 들어, 런타임에 DerviedOne, DerivedTwo 객체를 다음 예제의 Test 클래스에 삽입하려면 어떻게해야합니까? Spring에서 몇 가지 예제를 발견했지만 Spring을 사용하지는 않습니다. 이것은 당신이 당신은 producer methodqualifiers로 사용할 수 있습니다 런타임 조건에 따라 하나의 구현을 선택하려면 자바 EE 6CDI - 런타임에 객체를 동적으로 주입

public abstract class Base 
{ 
    public Base(String initiator) 
    { 
     this.initiator = initiator; 
    } 

    public abstract void process(); 

    public void baseProcess() 
    { 
     System.out.println("base process"); 
     process(); 
    } 

    public String getInitiator() 
    { 
     return initiator; 
    } 

    private String initiator; 
} 



public class BaseUtil 
{ 
    public long start() 
    { 
     return System.currentTimeMillis(); 
    } 

    public long stop() 
    { 
     return System.currentTimeMillis(); 
    } 
} 


public class DerivedOne extends Base 
{ 
    public DerivedOne(String initiator) 
    { 
     super(initiator); 
    } 

    @Override 
    public void process() 
    { 
     long start = baseUtil.start(); 
     System.out.println(getInitiator() + " process"); 
     long stop = baseUtil.stop(); 
     System.out.println(stop - start); 
    } 

    @javax.inject.Inject 
    private BaseUtil baseUtil; 
} 

public class DerivedTwo extends Base 
{ 
    public DerivedTwo(String initiator) 
    { 
     super(initiator); 
    } 

    @Override 
    public void process() 
    { 
     long start = baseUtil.start(); 
     System.out.println(getInitiator() + " process"); 
     long stop = baseUtil.stop(); 
     System.out.println(stop - start); 
    } 

    @javax.inject.Inject 
    private BaseUtil baseUtil; 

} 

@Startup 
@Singleton 
public class Test 
{ 
    @PostConstruct 
    public void init() 
    { 
     String initiator = "two"; 
     Base base = null; 

     if("one".equals(initiator)) 
     { 
      base = new DerivedOne("DerivedOne"); 
     } 
     else if("two".equals(initiator)) 
     { 
      base = new DerivedTwo("DerivedTwo"); 
     } 

     base.baseProcess(); 
    } 
} 

답변

3

를 사용하여 CDI와 동적 웹 프로젝트입니다.

CDI 응용 프로그램을 테스트 할 때는 Arquillian을 적극 권장합니다. http://arquillian.org/

+0

InjectionPoint를 제작자에게 삽입하고 주입에 대한 해당 개체의 모든 메타 데이터를 키 수 있습니다. – LightGuard

+0

감사합니다. Jason, InjectionPoint도 좋은 해결책입니다. – Heidarzadeh

관련 문제