JavaEE6规范CDI教程第二部分

2014-11-24 01:08:52 · 作者: · 浏览: 0

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