(翻譯)JavaEE6規范 CDI教程第二部分
(譯)JavaEE6規范 CDI教程第二部分
本部分講述@Inject和@Produces
使用@Inject注入構造器參數和變量域
你能夠注入變量域、構造器參數和setter方法(或者任何真實的方法)
下面是變量域注入的例子:
// AutomatedTellerMachineImpl.transport 使用@Inject來注入變量域transport
...
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
private ATMTransport transport;
Example 2. AutomatedTellerMachineImpl.transport 使用@Inject來注入構造器參數
...
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
public AutomatedTellerMachineImpl(ATMTransport transport) {
this.transport = transport;
}
這種靈活性讓你創建的類能夠容易的單元測試。
使用簡單@Produces
如果你創建的對象可能很復雜,這時候你可以委托一個工廠類來創建實例,而不是依賴于構造器。這種情況在CDI中你可以在你的工廠類中使用@Produces注解,例子如下:
下面是變量域注入的例子:
//TransportFactory.createTransport 使用@Produces定義一個工廠方法
package org.cdi.advocacy;
import javax.enterprise.inject.Produces;
public class TransportFactory {
@Produces ATMTransport createTransport() {
System.out.println("ATMTransport created with producer");
return new StandardAtmTransport();
}
}
工廠方法能夠使用限定詞就像類描述一樣。在這個例子中我們沒有使用限定詞。AutomatedTellerMachineImpl不需要指定任何特定的限定詞。下面例子的AutomatedTellerMachineImpl接收了一個簡單生產者。
//AutomatedTellerMachineImpl.transport 使用@Inject來注入構造器參數
import javax.inject.Inject;
import javax.inject.Named;
@Named("atm")
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
private ATMTransport transport;
...
運行AtmMain來查看輸出,看看是否和你的理解一致。 Output
ATMTransport created with producer deposit called communicating with bank via Standard transport
待續..
2011-06-11
posted on 2011-06-17 11:10 kuuyee 閱讀(2094) 評論(0) 編輯 收藏 所屬分類: CDI 、JEE