Calvin's Tech Space

          成于堅(jiān)忍,毀于浮躁

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理

           (本文轉(zhuǎn)自http://www.cnblogs.com/zhuweisky/archive/2006/01/19/320220.html)

          一個(gè)朋友發(fā)了封mail問(wèn)了幾個(gè)問(wèn)題,其中的一個(gè)是關(guān)于IoC和DI的:
          Inversion of Control和Dependency Injection 是什么關(guān)系,我認(rèn)為兩個(gè)詞代表的是同一個(gè)意思,只是兩種不同的表示,對(duì)嗎?

          下面是我對(duì)這個(gè)問(wèn)題的一些理解。
          準(zhǔn)確的說(shuō),IoC和DI并不相同,這一點(diǎn)從字面上就可以看出,否則,它們可以叫一個(gè)名字。^_^

          理解IoC,我們需要知道Control是什么,它又是怎樣被Inversion的。其實(shí),IoC是用來(lái)說(shuō)明“程序庫(kù)”和“框架”區(qū)別的最好證據(jù)。在使用程序庫(kù)的時(shí)候,控制權(quán)是掌握在我們手中的,我們編寫的代碼調(diào)用程序庫(kù)的實(shí)現(xiàn),完成相應(yīng)的功能,想想我們使用JDK的情況。使用框架的時(shí)候,控制權(quán)則掌握在框架手中,我們的代碼最終是由框架調(diào)用,一個(gè)常見(jiàn)的例子是Servlet,我們編寫的Servlet代碼是放在整個(gè)Servlet的框架中,由Web容器進(jìn)行調(diào)用。這就是差異所在。我們更習(xí)慣于自己掌控一切,因此,對(duì)框架掌握控制權(quán)的這種情況,我們用“Inversion”來(lái)形容,這也是Martin Fowler在那篇給DI正名的文章中提到,所有框架都是IoC的原因。

          Spring的核心容器是一個(gè)框架,所以,我們可以說(shuō)它是IoC,但是就如前面所說(shuō),每個(gè)框架都有IoC,所以,僅僅用IoC是不足以說(shuō)明一切的。Spring核心容器完成的是組件組裝的過(guò)程,這是它和其它普通框架區(qū)別最為顯著的地方。如果說(shuō)用IoC描述這個(gè)框架,那么,這里所指的Control實(shí)際上是組件的組裝過(guò)程。

          站在Spring核心容器的層面上看,它完成組裝過(guò)程是把組件所依賴的零部件給組件安裝上去。站在單個(gè)組件層面上看,它所需要的零部件是由外部給它安裝的,這個(gè)過(guò)程就像是把“Dependency”這管藥水用注射器“Injection”到組件的身體中去,所以,我們稱之為“Dependency Injection”。

          完成組件組裝的容器也不只是注入一種形式,還有一種常見(jiàn)的方式是“Dependency Lookup”,即每個(gè)組件自己去查找自己所需要的內(nèi)容。至于到哪去找,也有不同的實(shí)現(xiàn)方式,有固定到某個(gè)地方(比如使用靜態(tài)方法),有把查找點(diǎn)通過(guò)DI的方式注入進(jìn)來(lái)等等。

          Martin Fowler的文章已經(jīng)很清楚的解釋了IoC和DI這兩個(gè)概念,我們只需要去細(xì)細(xì)品味。

          posted on 2009-08-18 12:12 calvin 閱讀(212) 評(píng)論(0)  編輯  收藏 所屬分類: Framework

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 通江县| 加查县| 东宁县| 渝中区| 通江县| 太保市| 会昌县| 苍山县| 巨野县| 洪雅县| 南木林县| 唐海县| 吴桥县| 彩票| 北辰区| 新营市| 富民县| 青川县| 徐州市| 邢台县| 同仁县| 遂宁市| 富阳市| 奎屯市| 册亨县| 临江市| 米泉市| 溧水县| 丰顺县| 武川县| 舞阳县| 子洲县| 明星| 望奎县| 岑溪市| 宜君县| 两当县| 阜宁县| 冀州市| 陵川县| 正宁县|