(翻譯)JavaEE6規(guī)范 CDI教程第四部分
(譯)JavaEE6規(guī)范 CDI教程第四部分
本部分講述@Producer。
使用@Producer來決定如何創(chuàng)建
可能你希望從AutomatedTellerMachineImpl中把選取傳輸器的方法分離出來。
你可以創(chuàng)建一個(gè)Producer方法來決定創(chuàng)建和選取傳輸器,看下面的實(shí)例:
//TransportFactory決定使用/創(chuàng)建哪個(gè)傳輸器
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();
}
}
}
把創(chuàng)建動(dòng)作從AutomatedTellerMachineImpl代碼中分離出來是比較高級(jí)的做法。
可能你不總是這么做,但是如果是的話,producer可以幫助你。
輸出和前面的一樣。
Output
ATMTransport created with producer makes decisions Created JSON transport deposit called communicating with bank via JSON REST transport
在@Producer中使用限定詞來決定如何創(chuàng)建
這個(gè)例子在最后構(gòu)建
你同樣可以吧注入項(xiàng)作為參數(shù)傳入到producer中,如下:
//TransportFactory決定使用/創(chuàng)建哪個(gè)傳輸器
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;
}
} else {
System.out.println("Create Standard transport");
return new StandardAtmTransport();
}
}
}
在上面的例子中,createTransport作為CDI的創(chuàng)建動(dòng)作,通過傳遞soapTransport和jsonTransport減少了工廠方法并增加了選擇方法
高級(jí)話題 你可能奇怪為什么單獨(dú)創(chuàng)建StandardAtmTransport而不是像soapTransport和jsonTransport那樣通過參數(shù)注入進(jìn)來。原因是這里的createTransport默認(rèn)使用了@Default和@Any,但是被他重寫的StandardAtmTransport同樣默認(rèn)使用@Default和@Any,如果我們使用@Default ATMTransport standardTransport作為參數(shù)注入StandardAtmTransport,那么它就會(huì)嘗試調(diào)用createTransport,這樣就繼續(xù)注入?yún)?shù)standardTransport,然后又會(huì)調(diào)用createTransport,這就產(chǎn)生了無(wú)限循環(huán),知道拋出StackTraceOverflow異常。解決辦法是創(chuàng)建一個(gè)@Standard限定注解,然后在注入標(biāo)準(zhǔn)傳輸器StandardAtmTransport。
下面是輸出內(nèi)容。 Output
ATMTransport created with producer makes decisions return passed JSON transport deposit called communicating with bank via JSON REST transport
待續(xù)..
posted on 2011-06-28 18:26 kuuyee 閱讀(2186) 評(píng)論(4) 編輯 收藏 所屬分類: CDI 、JEE