Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          什么是Ioc(Inversion of Control) (zhuan)

          這篇短文基本上是改編自Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern,目的呢,是讓讀者能夠在最短時間內了解IoC的概念。這也是我一貫的“風格”:最短的文字、最精要的內容、最清晰的說明。希望我能做到,自勉^_^


          J2EE應用開發中,經常遇到的問題就是:如何將不同的組件組裝成為一個內聚的應用程序?IoC模式可以解決這個問題,其目標是將組件的配置與使用分離開。

          IoC,Inversion of Control,控制反轉[1],其原理是基于OO設計原則的The Hollywood PrincipleDon't call us, we'll call you。也就是說,所有的組件[2]都是被動的(Passive),所有的組件初始化和調用都由容器負責。組件處在一個容器當中,由容器負責管理。

          要說明IoC模式最好的方法是使用代碼。下邊是一段正常的代碼。

          class ClassA...

            public String aMethod(String arg){

              String result = instanceOfClassB.bMethod();

              do something;

              return result;

            }

          在上邊的代碼里,我們要解決的問題是:ClassA如何獲得ClassB的實例?一個最直接的方法是在aMethod里聲明:

          IClassB instanceOfClassB = new ClassB();

          這里使用了一個接口IClassB。

          問題是,如果出現這樣的情況:繼續使用ClassA,但要求用IClassB的另一個實現ClassB2代替ClassB呢?更概括一點說:ClassA怎樣才能找到IClassB的具體實現?很明顯,上述代碼增加ClassAClassB的耦合度,以致于無法在不修改ClassA的情況下變更IClassB的具體實現。

          IoC模式就是用于解決這樣的問題。當然,還有其他的方法,比如Service Locator模式,但現在我們只關注IoC。如前所述,IoC容器負責初始化組件(如IClassB),并將實例交給使用者。使用代碼或配置文件以聲明的方式將接口與實例關聯起來,IoC容器負責進行實際的調用處理。對于調用者,只需要關注接口就行了。

          根據實例傳入方式的不同,IoC分為type 1 IoC(接口注入[3])、type 2 IoC(設值方法注入)和type 3 IoC(構造子注入)。分別用代碼說明如下:

          type 1 IoC(接口注入)

          public interface GetClassB {

            void getClassB(IClassB instanceOfClassB);

          }

           

          class ClassA implements GetClassB…

            IClassB instanceOfClassB;

            void getClassB(IClassB instanceOfClassB) {

          this.instanceOfClassB = instanceOfClassB;

            }

          type 2 IoC(設值方法注入)

          class ClassA...

            IClassB instanceOfClassB;

            public void setFinder(IClassB instanceOfClassB) {

              this.instanceOfClassB = instanceOfClassB;

            }

          type 3 IoC(構造子注入)

          class ClassA…

          ClassB instanceOfClassB;

            public classA(IClassB instanceOfClassB) {

              this. instanceOfClassB = instanceOfClassB;

            }

            Spring使用的是type 2 IoC。


          [1] Martin FowlerInversion of Control Containers and the Dependency Injection pattern一文中,作者提出本模式更準確的名稱應該是Dependency Injection。考慮到使用上的習慣,在本文檔中我們將繼續使用IoC的概念。

          [2] 同一篇文章中,Martin Fowler還提出了Componet(組件)與Service(服務)的區別問題。我個人認為“組件”更有助于幫助我們理解IoC的概念,所以在本文檔中使用“組件”來代表“組件或服務”

          [3] 如上所述,注入是另一種說法,此處只用于輔助說明。


          posted on 2006-03-11 08:28 都市淘沙者 閱讀(2957) 評論(0)  編輯  收藏 所屬分類: Spring+Struts+Hibernate

          主站蜘蛛池模板: 东至县| 会昌县| 赤水市| 甘德县| 修文县| 南通市| 洛扎县| SHOW| 潍坊市| 泾川县| 荃湾区| 基隆市| 三江| 屏东市| 湾仔区| 房产| 余庆县| 桓台县| 拜泉县| 万山特区| 塔城市| 南岸区| 安平县| 凤冈县| 交城县| 贡嘎县| 阳城县| 新安县| 班玛县| 多伦县| 汶上县| 石泉县| 阳原县| 桂阳县| 山阳县| 宜川县| 贺兰县| 五峰| 托克逊县| 盐山县| 阿拉尔市|