天天看點

Spring 的IOC和AOP總結

Spring 的IOC和AOP

IOC

1.IOC

許多應用都是通過彼此間的互相合作來實作業務邏輯的,如類A要調用類B的方法,以前我們都是在類A中,通過自身new一個類B,然後在調用類B的方法,現在我們把new類B的事情交給spring來做,在我們調用的時候,容器會為我們執行個體化。

IOC(DI):其實這個Spring架構核心的概念沒有這麼複雜,更不像有些書上描述的那樣晦澀。java程式員都知道:java程式中的每個業務邏輯至少需要兩個或以上的對象來協作完成,通常,每個對象在使用他的合作對象時,自己均要使用像new object() 這樣的文法來完成合作對象的申請工作。你會發現:對象間的耦合度高了。而IOC的思想是:Spring容器來實作這些互相依賴對象的建立、協調工作。對象隻需要關系業務邏輯本身就可以了。從這方面來說,對象如何得到他的協作對象的責任被反轉了(IOC、DI)。

這是我對Spring的IOC的體會。DI其實就是IOC的另外一種說法。DI是由Martin Fowler 在2004年初的一篇論文中首次提出的。他總結:控制的什麼被反轉了?就是:獲得依賴對象的方式反轉了。

IoC與DI

  首先想說說IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對于spring架構來說,就是由spring來負責控制對象的生命周期和對象間的關系。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq号、電話号、ip号、iq号………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和面對每個環節。傳統的程式開發也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要将對象銷毀(比如Connection等),對象始終會和其他的接口或類藕合起來。

  那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個清單,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周傑倫,速度像卡洛斯,技術像齊達内之類的,然後婚介就會按照我們的要求,提供一個mm,我們隻需要去和她談戀愛、結婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會抛出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統運作到适當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,是以這叫控制反轉。如果你還不明白的話,我決定放棄。

IoC的一個重點是在系統運作中,動态的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實作的。比如對象A需要操作資料庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就隻需要告訴spring,A中需要一個Connection,至于這個Connection怎麼構造,何時構造,A不需要知道。在系統運作時,spring會在适當的時候制造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運作,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實作的呢? Java 1.3之後一個重要特征是反射(reflection),它允許程式在運作的時候動态的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實作注入的。關于反射的相關資料請查閱java doc。

2. IOC容器的初始化過程

     資源定位,即定義bean的xml-------》載入--------》IOC容器注冊,注冊beanDefinition

    IOC容器的初始化過程,一般不包含bean的依賴注入的實作,在spring IOC設計中,bean的注冊和依賴注入是兩個過程,,依賴注入一般發生在應用第一次索取bean的時候,但是也可以在xm中配置,在容器初始化的時候,這個bean就完成了初始化。

3. 三種注入方式,構造器、接口、set注入,我們常用的是set注入

4. bean是如何建立---  工廠模式

5. 資料是如何注入-------反射

AOP

6.AOP

        面向切面程式設計,在我們的應用中,經常需要做一些事情,但是這些事情與核心業務無關,比如,要記錄所有update*方法的執行時間時間,操作人等等資訊,記錄到日志,

通過spring的AOP技術,就可以在不修改update*的代碼的情況下完成該需求。

7.AOP的實作原理------代理

1、概念術語  

在開始之前,需要了解Spring aop 的一些基本的概念術語(總結的個人了解,并非Spring官方定義):

  • 切面(aspect):用來切插業務方法的類。
  • 連接配接點(joinpoint):是切面類和業務類的連接配接點,其實就是封裝了業務方法的一些基本屬性,作為通知的參數來解析。
  • 通知(advice):在切面類中,聲明對業務方法做額外處理的方法。
  • 切入點(pointcut):業務類中指定的方法,作為切面切入的點。其實就是指定某個方法作為切面切的地方。
  • 目标對象(target object):被代理對象。
  • AOP代理(aop proxy):代理對象。

AOP通知類型:

  • 前置通知(before advice):在切入點之前執行。
  • 後置通知(after returning advice):在切入點執行完成後,執行通知。
  • 環繞通知(around advice):包圍切入點,調用方法前後完成自定義行為。
  • 異常通知(after throwing advice):在切入點抛出異常後,執行通知。

2、Spring AOP環境

要在項目中使用Spring AOP 則需要在項目中導入除了spring jar包之外,還有aspectjweaver.jar,aopalliance.jar ,asm.jar 和cglib.jar 。

好了,前提工作準備完成,Spring 提供了很多的實作AOP的方式,在學習過程中,循序漸進。進行Spring 接口方式,schema配置方式和注解的三種方式進行學習。好了廢話不多說了,開始spring aop學習之旅:

3、方式一:AOP接口

利用Spring AOP接口實作AOP,主要是為了指定自定義通知來供spring AOP機制識别。主要接口:前置通知 MethodBeforeAdvice ,後置通知:AfterReturningAdvice,環繞通知:MethodInterceptor,異常通知:ThrowsAdvice 。

轉載于:https://www.cnblogs.com/Fairy-02-11/p/8194564.html