(翻譯)JavaEE6規(guī)范 CDI教程第四部分

          (譯)JavaEE6規(guī)范 CDI教程第四部分

          kuuyee  |  2011-06-28  |  JEE   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而不是像soapTransportjsonTransport那樣通過參數(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ù)..

          2011-06-28

          posted on 2011-06-28 18:26 kuuyee 閱讀(2186) 評(píng)論(4)  編輯  收藏 所屬分類: CDIJEE

          評(píng)論

          # re: (翻譯)JavaEE6規(guī)范 CDI教程第四部分 2011-06-29 08:41 愛問知識(shí)人

          嗯,博主辛苦了 收藏先  回復(fù)  更多評(píng)論   

          # re: (翻譯)JavaEE6規(guī)范 CDI教程第四部分 2011-06-29 11:33 站長(zhǎng)工具

          這種方法不錯(cuò)。  回復(fù)  更多評(píng)論   

          # re: (翻譯)JavaEE6規(guī)范 CDI教程第四部分 2011-06-29 19:04 casino på nätet

          Great Helpful Codes out there!   回復(fù)  更多評(píng)論   

          # re: (翻譯)JavaEE6規(guī)范 CDI教程第四部分 2011-06-29 19:07 casino på nätet

          Xie Xie Ni!   回復(fù)  更多評(píng)論   

          導(dǎo)航

          <2011年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統(tǒng)計(jì)

          隨筆分類(139)

          Linux內(nèi)核

          搜索

          •  

          積分與排名

          • 積分 - 320260
          • 排名 - 178

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 临泽县| 邵东县| 勃利县| 威远县| 开鲁县| 剑川县| 浏阳市| 广宗县| 石门县| 成安县| 泰顺县| 惠州市| 永善县| 广平县| 营口市| 花莲县| 镇巴县| 荥经县| 大荔县| 云安县| 新野县| 都昌县| 阿拉善盟| 台州市| 龙江县| 晋城| 皋兰县| 荣成市| 东城区| 东平县| 宜良县| 固始县| 尚义县| 綦江县| 尉犁县| 大余县| 泸州市| 定结县| 深泽县| 嘉荫县| 泰州市|