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

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

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

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825447
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

    理解IoC的概念

      IoC全稱Inversion of Control,直譯為控制反轉(zhuǎn).何謂IoC?在解釋此概念之前,我們來看看下面的例子
    import ...

    public class BookService {
      private BookDAO bookDAO = new DbBookDAO();
      
      public List<Book> listBooks(String author) {
        List<Book> books = bookDAO.listAll();
        return books ;
      }
    }

    可以看到,listBooks方法的功能非常簡單,即列出所有書籍.而列出所有書籍的功能被委托給bookDAO對象.
    考慮到書籍可能存在多種形式,如數(shù)據(jù)庫,XML文件等,將BookDAO申明為接口,因此我們實現(xiàn)了一個具體
    子類DbBookDAO.
      現(xiàn)在需要考慮的是,BookService如何持有bookDAO對象.最簡單的辦法是,在BookService的內(nèi)部持有
    一個DbBookDAO的實例,上面的例子確實是這么做的.考慮一下會發(fā)現(xiàn)以下的問題:
    (1)在BookService中硬編碼創(chuàng)建了BookDAO,如果需要另一種BookDAO的實現(xiàn),則需要修改BookService的
     代碼,換句話就是BookService組件不能脫離BookDAO的具體實現(xiàn).
    (2)BookDAO的實例無法被其它組件共享.假設(shè)其它的組件也需要引用BookDAO,則多個組件很難共享一個
     BookDAO實例,因為該實例的生命周期定義在了BookService組件中了,從而難以共享.
    (3)如果BookDAO仍需要引用其它資源,例如DataSource,則BookService可能還需要負(fù)責(zé)管理和維護(hù)一個
     DataSource,而這實例不是作為上層組件BookService的職責(zé).
    (4)測試BookService是復(fù)雜的,因為首先編寫DbBookDAO,倘若DbBookDAO還依賴于DataSource,是相當(dāng)復(fù)雜.
      從以上幾點可以看出,如果系統(tǒng)中有大量的組件,其它生命周期和相互之間的依賴關(guān)系,如果由組件
    自己維護(hù),不但加大的系統(tǒng)的復(fù)雜度,而且會導(dǎo)致組件之間的極為緊密的耦合,繼而給測試和維護(hù)帶來了
    極大的困難.
      在IoC模式下,控制權(quán)發(fā)生了反轉(zhuǎn):從應(yīng)用程序轉(zhuǎn)移到了IoC容器.組件不再由應(yīng)用程序負(fù)責(zé)創(chuàng)建和配置
    而是由容器負(fù)責(zé),應(yīng)用程序只需直接使用已經(jīng)創(chuàng)建并配置好的組件.

    import ...

    public class BookService {
      private BookDAO bookDAO ;
      public void setBookDAO(BookDAO bookDAO) {
       this.bookDAO = bookDAO ;
      }
      
      public List<Book> listBooks(String author) {
        List<Book> books = bookDAO.listAll();
        return books ;
      }
    }
    修改后的bookDAO實例不再由BookService創(chuàng)建,而是由IoC容器負(fù)責(zé)將某個BookDAO實例通過setBookDAO()
    注入.這樣做的好處:
    (1)BookService不必關(guān)心如何創(chuàng)建BookDAO的實例,也不必關(guān)心BookDAO的具體實現(xiàn),只需要使用它就可以了
     因此簡化了BookService的編碼.
    (2)BookDAO的實例由IoC容器管理,因此,可以在多個組件之間共享,只要它們也實現(xiàn)了相應(yīng)的setBookDAO()
     方法就可以了.
    (3)測試BookService也變成十分容易了.

    IoC容器負(fù)責(zé)實例化所有的組件,因此需要告訴容器如何創(chuàng)建組件和各組件之間的依賴關(guān)系.



    posted on 2007-10-21 12:59 Ke 閱讀(610) 評論(1)  編輯  收藏 所屬分類: spring

    FeedBack:
    # re: spring2.0學(xué)習(xí)筆記二(理解IoC的概念) 2008-09-07 22:59 WangSir
    對概念的闡述得很優(yōu)秀,一看就明白,Thanks!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 精品成人免费自拍视频| 免费无码AV电影在线观看 | 老汉色老汉首页a亚洲| 国产成人精品免费视频动漫 | 亚洲电影一区二区| 成熟女人特级毛片www免费| 成年免费大片黄在线观看com| 亚洲av永久无码精品国产精品| 在线看片无码永久免费视频| 一级片在线免费看| 亚洲国产精品久久网午夜| 亚洲国产精品日韩| 97免费人妻无码视频| 51午夜精品免费视频| 亚洲一区免费视频| 亚洲s色大片在线观看| 在线观看国产情趣免费视频| 久久精品私人影院免费看| 亚洲av无码一区二区三区人妖| 亚洲av日韩av无码黑人| 四虎永久免费影院| 69天堂人成无码麻豆免费视频| eeuss在线兵区免费观看| 亚洲三级高清免费| 337p日本欧洲亚洲大胆精品555588| 免费在线观看中文字幕| 成人免费AA片在线观看| 日韩视频在线观看免费| 免费大片av手机看片| 亚洲欧美自偷自拍另类视| 亚洲黄色免费电影| 国产亚洲午夜高清国产拍精品| 永久免费bbbbbb视频| 亚洲性线免费观看视频成熟 | 182tv免费观看在线视频| 国产伦精品一区二区免费| 亚洲女子高潮不断爆白浆| 亚洲小视频在线播放| 亚洲国产成人久久精品影视| 亚洲真人无码永久在线| 亚洲VA综合VA国产产VA中|