2012-08-07 66 views
2

如何在運行時注入對象?例如,如果我想在運行時注入DerviedOne,DerivedTwo對象到以下示例中的Test類中,那麼我該怎麼做?我在Spring中發現了一些例子,但我沒有使用Spring。這是使用Java 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

如果您要根據運行情況您可以使用producer methodqualifiers選擇一個實現動態Web項目與CDI。

爲了測試CDI應用程序,我強烈推薦Arquillian。 http://arquillian.org/

+0

您還可以將注入點注入到生產者中,並關閉該對象中關於注入的任何元數據。 – LightGuard 2012-08-08 18:53:05

+0

謝謝Jason,InjectionPoint也是一個很好的解決方案。 – Heidarzadeh 2012-08-09 09:09:32