常言笑的家

          Spring, Hibernate, Struts, Ajax, RoR

          控制反轉,依賴注入,好萊塢原則

          IoC 或者 DI 或者 …一大堆的縮寫詞
          依賴注入和控制反轉其實是同一回事,依賴注入最典型的應用就是控制反轉

          不管是面向對象,還是面向過程,都需要分成許多的塊,然后由這些部件協同工作完成任務
          要協同工作就會產生依賴,一個方法調用另一個方法,一個對象包含另一個對象
          如果對象A包含對象B的話,就需要在A里new一個B
          依賴注入從具體類B里抽象出接口IB——IB的具體實現可能有很多B,B1,B2…很多種——這樣A可以不用再new具體的B了,而是跟IoC容器說:我要一個IB(getBean("IB"))。然后,由容器根據配置文件來做具體的new的工作。具體new的是哪個,由配置文件從代碼外部決定,要更換成B,B1,或是B2…修改配置文件就能做到,不用再改代碼了

          例:
          假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。
          人有時候需要用手機打電話,需要用到手機的dialUp方法。
          傳統的寫法是這樣:

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

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


          Person類:
          //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文件中配置依賴關系
          //code
          <bean class="Person" id="person">
               
          <property name="mobileInterface">
                   
          <ref local="mobileInterface"></ref>
               
          </property>
          </bean> 
          <bean class="Mobile" id="mobileInterface"></bean>
          這樣,Person類在實現撥打電話的時候,并不知道Mobile類的存在,它只知道調用一個接口MobileInterface,而MobileInterface的具體實現是通過Mobile類完成,并在使用時由容器自動注入,這樣大大降低了不同類間相互依賴的關系。

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

          posted on 2010-07-19 11:21 常言笑 閱讀(1474) 評論(0)  編輯  收藏 所屬分類: 技術總結

          My Links

          Blog Stats

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 伊春市| 北票市| 沁阳市| 阜阳市| 灌南县| 汉源县| 汉中市| 辽阳市| 青阳县| 阜阳市| 蒲江县| 龙门县| 博白县| 孟州市| 平南县| 江永县| 汝城县| 寿光市| 天镇县| 东宁县| 旬邑县| 顺昌县| 凉城县| 隆昌县| 南平市| 喀喇| 沁阳市| 芷江| 辽宁省| 玉田县| 建湖县| 辰溪县| 长武县| 北川| 瑞安市| 新余市| 宜城市| 博白县| 汕尾市| 苍梧县| 吴川市|