常言笑的家

          Spring, Hibernate, Struts, Ajax, RoR

          控制反轉(zhuǎn),依賴(lài)注入,好萊塢原則

          IoC 或者 DI 或者 …一大堆的縮寫(xiě)詞
          依賴(lài)注入和控制反轉(zhuǎn)其實(shí)是同一回事,依賴(lài)注入最典型的應(yīng)用就是控制反轉(zhuǎn)

          不管是面向?qū)ο螅€是面向過(guò)程,都需要分成許多的塊,然后由這些部件協(xié)同工作完成任務(wù)
          要協(xié)同工作就會(huì)產(chǎn)生依賴(lài),一個(gè)方法調(diào)用另一個(gè)方法,一個(gè)對(duì)象包含另一個(gè)對(duì)象
          如果對(duì)象A包含對(duì)象B的話(huà),就需要在A里new一個(gè)B
          依賴(lài)注入從具體類(lèi)B里抽象出接口IB——IB的具體實(shí)現(xiàn)可能有很多B,B1,B2…很多種——這樣A可以不用再new具體的B了,而是跟IoC容器說(shuō):我要一個(gè)IB(getBean("IB"))。然后,由容器根據(jù)配置文件來(lái)做具體的new的工作。具體new的是哪個(gè),由配置文件從代碼外部決定,要更換成B,B1,或是B2…修改配置文件就能做到,不用再改代碼了

          例:
          假設(shè)你編寫(xiě)了兩個(gè)類(lèi),一個(gè)是人(Person),一個(gè)是手機(jī)(Mobile)。
          人有時(shí)候需要用手機(jī)打電話(huà),需要用到手機(jī)的dialUp方法。
          傳統(tǒng)的寫(xiě)法是這樣:

          //code
          public class Person
              
          public boolean makeCall(long number)
                  Mobile mobile
          =new Mobile(); 
                  
          return mobile.dialUp(number); 
              }
           
          }

          也就是說(shuō),類(lèi)Person的makeCall方法對(duì)Mobile類(lèi)具有依賴(lài),必須手動(dòng)生成一個(gè)新的實(shí)例new Mobile()才可以進(jìn)行之后的工作。
          依賴(lài)注入的思想是這樣,當(dāng)一個(gè)類(lèi)(Person)對(duì)另一個(gè)類(lèi)(Mobile)有依賴(lài)時(shí),不再該類(lèi)(Person)內(nèi)部對(duì)依賴(lài)的類(lèi)(Moblile)進(jìn)行實(shí)例化,而是之前配置一個(gè)beans.xml,告訴容器所依賴(lài)的類(lèi)(Mobile),在實(shí)例化該類(lèi)(Person)時(shí),容器自動(dòng)注入一個(gè)所依賴(lài)的類(lèi)(Mobile)的實(shí)例。
          接口
          //code
          public Interface MobileInterface
              
          public boolean dialUp(long number);
          }


          Person類(lèi):
          //code
          public class Person{
              
          private MobileInterface mobileInterface;
              
          public boolean makeCall(long number){
                  
          return this.mobileInterface.dialUp(number);
              }

              
          public void setMobileInterface(MobileInterface mobileInterface){
                  
          this.mobileInterface=mobileInterface;
              }

          }


          在xml文件中配置依賴(lài)關(guān)系
          //code
          <bean class="Person" id="person">
               
          <property name="mobileInterface">
                   
          <ref local="mobileInterface"></ref>
               
          </property>
          </bean> 
          <bean class="Mobile" id="mobileInterface"></bean>
          這樣,Person類(lèi)在實(shí)現(xiàn)撥打電話(huà)的時(shí)候,并不知道Mobile類(lèi)的存在,它只知道調(diào)用一個(gè)接口MobileInterface,而MobileInterface的具體實(shí)現(xiàn)是通過(guò)Mobile類(lèi)完成,并在使用時(shí)由容器自動(dòng)注入,這樣大大降低了不同類(lèi)間相互依賴(lài)的關(guān)系。

          什么叫控制反轉(zhuǎn)呢?
          套用好萊塢的一句名言就是:你呆著別動(dòng),到時(shí)我會(huì)找你。
          什么意思呢?就好比一個(gè)皇帝和太監(jiān)
          有一天皇帝想幸某個(gè)美女,于是跟太監(jiān)說(shuō),今夜我要寵幸美女
          皇帝往往不會(huì)告訴太監(jiān),今晚幾點(diǎn)會(huì)回宮,會(huì)回哪張龍床,他只會(huì)告訴太監(jiān)他要哪位美女
          其它一切都交由太監(jiān)去安排,到了晚上皇帝回宮時(shí),自然會(huì)有美女出現(xiàn)在皇帝的龍床上
          這就是控制反轉(zhuǎn),而把美女送到皇帝的寢宮里面去就是注射
          太監(jiān)就是是框架里面的注射控制器類(lèi)BeanFactory,負(fù)責(zé)找到美女并送到龍床上去
          整個(gè)后宮可以看成是Spring框架,美女就是Spring控制下的JavaBean
          而傳統(tǒng)的模式就是一個(gè)饑渴男去找小姐出臺(tái)
          找領(lǐng)班,幫助給介紹一個(gè)云云,于是領(lǐng)班就開(kāi)始給他張羅
          介紹一個(gè)合適的給他,完事后,再把小姐還給領(lǐng)班,下次再來(lái)
          這個(gè)過(guò)程中,領(lǐng)班就是查詢(xún)上下文Context,領(lǐng)班的一個(gè)職能就是給客戶(hù)找到他們所要的小姐
          這就是lookup()方法,領(lǐng)班手中的小姐名錄就是JNDI//Java Naming and Directory Interface
          小姐就是EJB,饑渴男是客戶(hù)端,青樓是EJB容器
          看到區(qū)別了么?饑渴男去找小姐出臺(tái)很麻煩,不僅得找,用完后還得把小姐給還回去
          而皇帝爽翻了,什么都不用管,交給太監(jiān)去處理,控制權(quán)轉(zhuǎn)移到太監(jiān)手中去了
          而不是皇帝,必要時(shí)候由太監(jiān)給注射進(jìn)去就可以了
          看到Spring的美妙了吧,Spring還提供了與多個(gè)主流框架的支持
          可以和其它開(kāi)源框架集成 

          posted on 2010-07-19 11:21 常言笑 閱讀(1494) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 技術(shù)總結(jié)

          My Links

          Blog Stats

          常用鏈接

          留言簿(5)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 辽宁省| 吐鲁番市| 五华县| 万宁市| 时尚| 额敏县| 陕西省| 房山区| 麦盖提县| 江安县| 涞源县| 北京市| 通城县| 元阳县| 湖南省| 鹤庆县| 朔州市| 孙吴县| 名山县| 东方市| 西华县| 潜江市| 上思县| 博白县| 开封县| 中牟县| 荔波县| 岳阳市| 仙桃市| 浮山县| 大庆市| 海门市| 藁城市| 年辖:市辖区| 宜春市| 沁水县| 深圳市| 五台县| 三穗县| 专栏| 长海县|