JavaEE6规范CDI教程第二部分
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
补充:软件开发 , Java ,