JavaEE6规范CDI教程第四部分
--------------------------------------------------------------------------------原文链接: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 databaseSystem.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补充:软件开发 , Java ,