<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    北大青鳥IT教育博客

     

    JAVA框架當中Spring的依賴注入和控制反轉

    Spring的核心機制依賴注入簡介
      Spring能有效地組織J2EE應用各層的對象。不管是控制層的Action對象,還是業務層的Service對象,還是持久層的DAO對象,都可在 Spring的治理下有機地協調、運行。Spring將各層的對象以松耦合的方式組織在一起,Action對象無須關心Service對象的具體實現,Service對象無須關心持久層對象的具體實現,各層對象的調用完全面向接口。當系統需要重構時,代碼的改寫量將大大減少。
      上面所說的一切都得宜于Spring的核心機制,依靠注入。依靠注入讓bean與bean之間以配置文件組織在一起,而不是以硬編碼的方式耦合在一起。

      依靠注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協助時,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在Spring里,創建被調用者的工作不再由調用者來完成,因此稱為控制反轉;創建被調用者實例的工作通常由Spring容器來完成,然后注入調用者,因此也稱為依靠注入。
      不管是依靠注入,還是控制反轉,都說明Spring采用動態、靈活的方式來治理各種對象。對象與對象之間的具體實現互相透明。在理解依靠注入之前,看如下這個問題在各種社會形態里如何解決:一個人(Java實例,調用者)需要一把斧子(Java實例,被調用者)。
      (1)原始社會里,幾乎沒有社會分工。需要斧子的人(調用者)只能自己去磨一把斧子(被調用者)。對應的情形為:Java程序里的調用者自己創建被調用者。
      (2)進入工業社會,工廠出現。斧子不再由普通人完成,而在工廠里被生產出來,此時需要斧子的人(調用者)找到工廠,購買斧子,無須關心斧子的制造過程。對應Java程序的簡單工廠的設計模式。
      (3)進入“按需分配”社會,需要斧子的人不需要找到工廠,坐在家里發出一個簡單指令:需要斧子。斧子就自然出現在他面前。對應Spring的依靠注入。
      第一種情況下,Java實例的調用者創建被調用的Java實例,必然要求被調用的Java類出現在調用者的代碼里。無法實現二者之間的松耦合。
      第二種情況下,調用者無須關心被調用者具體實現過程,只需要找到符合某種標準(接口)的實例,即可使用。此時調用的代碼面向接口編程,可以讓調用者和被調用者解耦,這也是工廠模式大量使用的原因。但調用者需要自己定位工廠,調用者與特定工廠耦合在一起。
      第三種情況下,調用者無須自己定位工廠,程序運行到需要被調用者時,系統自動提供被調用者實例。事實上,調用者和被調用者都處于Spring的治理下,二者之間的依靠關系由Spring提供。
      所謂依靠注入,是指程序運行過程中,假如需要調用另一個對象協助時,無須在代碼中創建被調用者,而是依靠于外部的注入。Spring的依靠注入對調用者和被調用者幾乎沒有任何要求,完全支持對POJO之間依靠關系的治理。依靠注入通常有兩種:
      ·設值注入。
      ·構造注入。 設值注入
      設值注入是指通過setter方法傳入被調用者的實例。這種注入方式簡單、直觀,因而在Spring的依靠注入里大量使用。看下面代碼,是Person的接口
       //定義Person接口
      public interface Person
      {
       //Person接口里定義一個使用斧子的方法
       public void useAxe();
      }
      
      然后是Axe的接口
      
       //定義Axe接口
      
      public interface Axe
      {
       //Axe接口里有個砍的方法
       public void chop();
      }
      Person的實現類
      
       //Chinese實現Person接口
      
      public class Chinese implements Person
      {
       //面向Axe接口編程,而不是具體的實現類
       private Axe axe;
       //默認的構造器
       public Chinese()
       {}
       //設值注入所需的setter方法
       public void setAxe(Axe axe)
       {
      this.axe = axe;
       }
       //實現Person接口的useAxe方法
       public void useAxe()
       {
      System.out.println(axe.chop());
       }
      }
      Axe的第一個實現類
      
       //Axe的第一個實現類 StoneAxe
      
      public class StoneAxe implements Axe
      {
       //默認構造器
       public StoneAxe()
       {}
       //實現Axe接口的chop方法
       public String chop()
       {
      return "石斧砍柴好慢";
       }
      }
      下面采用Spring的配置文件將Person實例和Axe實例組織在一起。配置文件如下所示:
      
       <!-- 下面是標準的XML文件頭 -->
      <?xml version="1.0" encoding="gb2312"?>
      <!-- 下面一行定義Spring的XML配置文件的dtd -->
      "   <!-- 以上三行對所有的Spring配置文件都是相同的 -->
      <!-- Spring配置文件的根元素 -->
      <BEANS>
       <!—定義第一bean,該bean的id是chinese, class指定該bean實例的實現類 -->
       <BEAN class=lee.Chinese id=chinese>
       <!-- property元素用來指定需要容器注入的屬性,axe屬性需要容器注入此處是設值注入,因此Chinese類必須擁有setAxe方法 -->

    posted on 2009-05-12 16:39 武漢北大青鳥 閱讀(174) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    默認

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲免费网站在线观看| 色窝窝免费一区二区三区| 亚洲精品无码专区久久| 亚洲日韩激情无码一区| 波多野结衣久久高清免费| 亚洲精品在线免费观看| a级毛片在线免费观看| 日韩在线观看免费完整版视频| 97久久国产亚洲精品超碰热| 亚洲午夜在线电影| 久久久久久a亚洲欧洲aⅴ| 亚洲成网777777国产精品| 免费毛片网站在线观看| 4444www免费看| 久久一本岛在免费线观看2020| 国产精品玖玖美女张开腿让男人桶爽免费看 | 无码不卡亚洲成?人片| 成人五级毛片免费播放| 黄页免费的网站勿入免费直接进入| 久章草在线精品视频免费观看| 2022国内精品免费福利视频| 黄色免费网址大全| 日本系列1页亚洲系列| 亚洲av日韩专区在线观看| 亚洲色欲色欲www在线播放| 亚洲私人无码综合久久网| 亚洲六月丁香婷婷综合| 亚洲区视频在线观看| 亚洲免费视频观看| 亚洲一区在线视频观看| 亚洲乱码一二三四五六区| 亚洲特级aaaaaa毛片| 亚洲午夜电影一区二区三区| 亚洲欧洲日产v特级毛片| 亚洲人成黄网在线观看| 亚洲熟妇无码一区二区三区导航 | 久久国产精品萌白酱免费| 性xxxx视频免费播放直播| 日本xxxx色视频在线观看免费| 99xxoo视频在线永久免费观看| 91精品国产免费久久国语蜜臀|