1. 使用@Inject註入構造器參數和變量域
你能夠註入變量域、構造器參數和setter方法(或者任何真實的方法)
下面是變量域註入的例子:
例 1. AutomatedTellerMachineImpl.transport 使用@Inject來註入變量域transport
…
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
private ATMTransport transport;
例 2. AutomatedTellerMachineImpl.transport 使用@Inject來註入構造器參數
…
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
public AutomatedTellerMachineImpl(ATMTransport transport) {
this.transport = transport;
}
這種靈活性讓你創建的類能夠容易的單元測試。
2. 使用簡單@Produces
如果你創建的對象可能很復雜,這時候你可以委托一個工廠類來創建實例,而不是依賴於構造器。這種情況在CDI中你可以在你的工廠類中使用@Produces註解,例子如下:
下面是變量域註入的例子:
例 3. 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接收瞭一個簡單生產者。
例 4. AutomatedTellerMachineImpl.transport 使用@Inject來註入構造器參數
import javax.inject.Inject;
import javax.inject.Named;
@Named(“atm”)
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject
private ATMTransport transport;
…
運行AtmMain來查看輸出,看看是否和你的理解一致。
Output