spring中的AOP和IOC

                                        IOC(控制反轉(Inversion of Control))AOP(面向切面)

IOC的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器負責將這些聯繫在一起。 

原理介紹

 

  早在2004年,Martin Fowler就提出了哪些方面的控制被反轉了?這個問題。他總結出是依賴對象的獲得被反轉了。基於這個結論,他爲控制反轉創造了一個更好的名字:依賴注入。許多非凡的應用(比HelloWorld.java更加優美,更加複雜)都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個對象都需要,與其合作的對象(也就是它所依賴的對象)的引用。如果這個獲取過程要靠自身實現,那麼如你所見,這將導致代碼高度耦合並且難以測試。   IoC 亦稱爲 依賴倒置原理”("Dependency Inversion Principle") (Martin 2002:127)。差不多所有框架都使用了倒置注入(Fowler 2004)技巧,這可說是IoC原理的一項應用。SmallTalkC++, Java 或各種.NET 語言等面向對象程序語言的程序員已使用了這些原理。控制反轉是Spring Framework的核心。   其原理是基於OO設計原則的The Hollywood PrincipleDon't call us, we'll call you(別找我,我會來找你的)。也就是說,所有的組件都是被動的(Passive),所有的組件初始化和調用都由容器負責。組件處在一個容器當中,由容器負責管理。   簡單的來講,就是由容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控。這也就是所謂控制反轉的概念所在:控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。

        IoCDI   首先想說說IoCInversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制對象的生命週期和對象間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裏有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和麪對每個環節。傳統的程序開發也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將對象銷燬(比如Connection等),對象始終會和其他的接口或類藕合起來。   那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷燬都由 spring來控制,也就是說控制對象生存週期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。如果你還不明白的話,我決定放棄。 IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DIDependency Injection,依賴注入)來實現的。比如對象A需要操作數據庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就只需要告訴springA中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知道。在系統運行時,spring會在適當的時候製造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個對象之間關係的控制。A需要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3之後一個重要特徵是反射(reflection),它允許程序在運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實現注入的。關於反射的相關資料請查閱java doc  理解了IoCDI的概念後,一切都將變得簡單明瞭,剩下的工作只是在spring的框架中堆積木而已。

        Aspect Oriented Programming 面向切面編程(面向方面編程)。從傳統面向對象的編程角度出發,相對於OOP,面向AOP更具有可拓展性和高維護性的優勢。具體表現在:以往我們都以世界萬物皆對象的思想進行編程時,會將一切事物抽象成一個實體,並使用這個實體進行我們業務方面的拓展。當然,這樣做是不錯的,但是帶來了問題!比如說,當我們抽象出來的一個實體不再是一個具體的實物,而是可分爲多個抽象實物的統一點時,那麼之前對於該實體進行的一切程序開發都需要進行維護和拓展,從而增加了維護成本。AOPer崇尚面向方面編程,即將一切實物都抽象的看做是多個實體的抽象體,而每個不同類型的抽象體都能夠作爲這個實物的一種實現機制的表現,從而在業務拓展時減少對原有代碼的維護,取而代之的則是 增加->切換 的操作。 ------------- IOC,名爲對象控制反轉,簡單的可以理解爲AOP概念的一個功能實現。主要運用在對象中!當你將面向對象理解的比較深入的時候,就可以這樣理解IOC了:當你需要敲碎一塊石頭時,你將怎麼做,分別說明這個過程?我可以給你的答案是: 1、我可以用槌子來敲碎石頭 2、我可以用碎石機來敲碎石頭 3、我可以找別人來幫忙敲碎石頭然後分析這個需求。主體是,動作是。這裏的IOC主要是用來控制用什麼的,從而爲了達到目的而使用不同的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章