JavaEE6规范CDI教程第四部分

2014-11-24 01:19:29 · 作者: · 浏览: 0


--------------------------------------------------------------------------------

原 文 链 接 :http://code.google.com/p/jee6-cdi/wiki/DependencyInjectionAnIntroductoryTutorial
本 部 分 讲 述 @Producer。
1. 使 用 @Producer来 决 定 如 何 创 建
可 能 你 希 望 从 AutomatedTellerMachineImpl中 把 选 取 传 输 器 的 方 法 分 离 出 来 。
你 可 以 创 建 一 个 Producer方 法 来 决 定 创 建 和 选 取 传 输 器 ,看 下 面 的 实 例 :
例 1. TransportFactory决 定 使 用 /创 建 哪 个 传 输 器
package org.cdi.advocacy;

import javax.enterprise.inject.Produces;

public class TransportFactory {

private boolean useJSON = true;
private boolean behindFireWall = true;


@Produces ATMTransport createTransport() {
//Look up config parameters in some config file or LDAP server or database

System.out.println("ATMTransport created with producer makes decisions");

if (behindFireWall) {
if (useJSON) {
System.out.println("Created JSON transport");
return new JsonRestAtmTransport();
} else {
System.out.println("Created SOAP transport");
return new SoapAtmTransport();
}
} else {
System.out.println("Created Standard transport");
return new StandardAtmTransport();
}
}

}


把 创 建 动 作 从 AutomatedTellerMachineImpl代 码 中 分 离 出 来 是 比 较 高 级 的 做 法 。
可 能 你 不 总 是 这 么 做 ,但 是 如 果 是 的 话 ,producer可 以 帮 助 你 。
输 出 和 前 面 的 一 样 。
Output
ATMTransport created with producer makes decisions
Created JSON transport
deposit called
communicating with bank via JSON REST transport
2. 在 @Producer中 使 用 限 定 词 来 决 定 如 何 创 建
这 个 例 子 在 最 后 构 建
你 同 样 可 以 吧 注 入 项 作 为 参 数 传 入 到 producer中 ,如 下 :
例 2. TransportFactory决 定 使 用 /创 建 哪 个 传 输 器
package org.cdi.advocacy;

import javax.enterprise.inject.Produces;

public class TransportFactory {

private boolean useJSON = true;
private boolean behindFireWall = true;


@Produces ATMTransport createTransport( @Soap ATMTransport soapTransport,
@Json ATMTransport jsonTransport) {
//Look up config parameters in some config file
System.out.println("ATMTransport created with producer makes decisions");

if (behindFireWall) {
if (useJSON) {
System.out.println("return passed JSON transport");
return jsonTransport;
} else {
System.out.println("return passed SOAP transport");
return soapTransport;
}
&nb