spring AOP的基本概念

AOP的概念和使用緣由

  現實中有一些內容並非面向對象(OOP)能夠解決的,好比數據庫事務,它對於企業級的Java EE應用而言是十分重要的,又如在電商網站購物須要通過交易系統、財務系統,對於交易系統存在一個交易記錄的對象,而財務系統則存在帳戶的信息對象。從這個角度而言,咱們須要對交易記錄和帳戶操做造成一個統一的事務管理。交易和帳戶的事務,要麼所有成功,要麼所有失敗。
  交易記錄和帳戶記錄都是對象,這兩個對象須要在同一個事務中控制,這就不是面向對象能夠解決的問題,而須要用到面向切面的編程,這裏的切面環境就是數據庫事務。
  AOP編程有着重要的意義,首先它能夠攔截一些方法,而後把各個對象組織成一個總體,好比網站的交易記錄須要記錄日誌,若是咱們約定好了動態的流程,那麼就能夠在交易先後、交易正常完成後或者交易異常發生時,經過這些約定記錄相關的日誌了。

  回到JDBC的代碼中,使人最討厭和最折騰的問題永遠是無窮無盡的try...catch...finally...語句和數據庫資源的關閉問題,並且這些代碼會存在大量重複,加上開發者水平良莠不齊。Spring出現前,在Java EE的開發中,try...catch...finally語句經常被嚴重濫用,使得Java EE的開發存在着許多問題,雖然MyBatis對JDBC作了良好的封裝,可是仍是不足的。

 


  這裏購買交易的產品和購買記錄都在try...catch...finally...語句中,首先須要本身去獲取對應的映射器,而業務流程中穿插着事務的提交和回滾,也就是若是交易能夠成功,那麼就會提交事務,交易若是發生異常,那麼就回滾事務,最後在finally語句中會關閉SqlSession所持有的功能。
  可是這並非一個很好的設計,按照Spring的AOP設計思惟,它但願寫成如代碼清單所示的代碼。

 



  這段代碼除了一個註解@Transactional,沒有任何關於打開或者關閉數據庫資源的代碼,更沒有任何提交或者回滾數據庫事務的代碼,可是它卻可以完成如代碼清單所示的所有功能。注意,這段代碼更簡潔,也更容易維護,主要都集中在業務處理上,而不是數據庫事務和資源管控上,這就是AOP的魅力。 
 

面向切面編程的術語

1. 切面(Aspect)
  切面就是在一個怎麼樣的環境中工做。好比數據庫的事務直接貫穿了整個代碼層面,這就是一個切面,它可以在被代理對象的方法以前、以後,產生異常或者正常返回後切入你的代碼,甚至代替原來被代理對象的方法,在動態代理中能夠把它理解成一個攔截器。

2. 通知(Adice)
  •通知是切面開啓後,切面的方法。它根據在代理對象真實方法調用前、後的順序和邏輯區分,它和約定遊戲的例子裏的攔截器的方法十分接近。
  •前置通知(before):在動態代理反射原有對象方法或者執行環繞通知前執行的通知功能。
  •後置通知(after):在動態代理反射原有對象方法或者執行環繞通知後執行的通知功能。不管是否拋出異常,它都會被執行。
  •返回通知(afterReturning):在動態代理反射原有對象方法或者執行環繞通知後執行的通知功能。   
  •異常通知(afterThrowing):在動態代理反射原有對象方法或者執行環繞通知產生異常後執行的通知功能。
  •環繞通知(aroundThrowing):在動態代理中,它能夠取代當前被攔截對象的方法,經過參數或反射調用被攔截對象的方法。

3. 引入(Introduction)
  引入容許咱們在現有的類裏添加自定義的類和方法。

4. 切點(Pointcut)
  在動態代理中,被切面攔截的方法就是一個切點,切面將能夠將其切點和被攔截的方法按照必定的邏輯織入到約定流程當中。

5. 鏈接點(join point)
  鏈接點是一個判斷條件,由它能夠指定哪些是切點。對於指定的切點,Spring會生成代理對象去使用對應的切面對其攔截,不然就不會攔截它。

6. 織入(Weaving)
  織入是一個生成代理對象的過程。實際代理的方法分爲靜態代理和動態代理。靜態代理是在編譯class文件時生成的代碼邏輯,可是在Spring中並不使用這樣的方式,因此咱們就不展開討論了。一種是經過ClassLoader也就是在類加載的時候生成的代碼邏輯,可是它在應用程序代碼運行前就生成對應的邏輯。還有一種是運行期,動態生成代碼的方式,這是Spring AOP所採用的方式,Spring是以JDK和CGLIB動態代理來生成代理對象的

 

Spring對AOP的支持

  AOP並非Spring框架特有的,Spring只是支持AOP編程的框架之一。每個框架對AOP的支持各有特色,有些AOP可以對方法的參數進行攔截,有些AOP對方法進行攔截。而Spring AOP是一種基於方法攔截的AOP,換句話說Spring只能支持方法攔截的AOP。在Spring中有4種方式去實現AOP的攔截功能。
  •使用ProxyFactoryBean和對應的接口實現AOP。
  •使用XML配置AOP。
  •使用@AspectJ註解驅動切面。
  •使用AspectJ注入切面。
  在Spring AOP的攔截方式中,真正經常使用的是用@AspectJ註解的方式實現的切面,有時候XML配置也有必定的輔助做用。對於ProxyFactoryBean和AspectJ注入切面的方式這兩種方式已經不多用了。數據庫

相關文章
相關標籤/搜索