AOP的基本概念程序員
AOP從運行的角度考慮程序的流程,提取業務處理過程的切面。AOP面向的是程序運行中的各個步驟,但願以更好的方式來組合業務邏輯的各個步驟。AOP框架並不與特定的代碼耦合,AOP框架能處理程序執行中特定切入點,而不與具體某個類耦合(即在不污染某個類的狀況下,處理這個類相關的切點)。下面是一些AOP的一些術語:編程
切面(Aspect):業務流程運行的某個特定步驟,也就是應用運行過程的關注點,關注點一般會橫切多個對象,所以常被稱爲橫切關注點服務器
鏈接點(JoinPoint):程序執行過程當中明確的點,如方法調用,或者異常拋出。Spring AOP中,鏈接點老是方法調用。架構
加強處理(Advice):AOP框架在特定的切入點執行的加強處理。處理有around,before,after等類型。(說明:AOP是比較前沿的知識,而大部分國內翻譯人士在翻譯計算機文獻時,老是一邊看各類翻譯軟件和詞典,一邊逐字逐句的翻譯,而不是先去從整體上把握知識的架構。所以不免致使一些術語翻譯的詞不達意,在AOP的術語上也存在較大差別,對於Advice一詞,有人翻譯爲「通知」,有人翻譯爲「建議」......實際上,Advice是指AOP框架在特定切面所加入的某種處理,筆者這裏翻譯爲「加強處理」,但願能夠表達出Advice的真正含義)框架
切入點(PointCut):能夠插入加強處理的鏈接點。簡而言之,當某個鏈接點知足執行要求時,該鏈接點將被添加加強處理,該鏈接點也就變成了切入點。例如:spa
pointcut xxxPointcut():execution(void H*.say*())
每一個方法被調用都只是鏈接點,但若是該方法屬於H開頭的類,且方法名以say開頭,按該方法的執行將變成切入點。如何使用表達式來定義切入點是AOP的核心,Spring默認使用AspectJ切入點語法。.net
引入:將方法或字段添加到被處理的類中。Spring容許引入新的接口到任何被處理的對象翻譯
目標對象:被AOP框架進行加強處理的對象,也被稱爲加強的對象。若是AOP框架是經過運行時代理來實現的,那麼這個對象將是一個被代理的對象。代理
AOP代理:AOP框架建立的對象,簡單地說,代理就是對目標的對象的增強。Spring中AOP代理能夠是JDK動態代理,也能夠是CGLIB代理。前者爲實現接口的目標對象的代理,後者爲不實現接口的目標對象的代理。code
織入(Weaving):將加強處理添加到目標對象中,並建立一個被加強的對象(AOP代理)的過程就是織入。織入有兩種實現方式:編譯時加強(如AspectJ)和運行時加強(如CGLIB)。Spring和其餘純Java AOP框架同樣,在運行時織入。
由前面的介紹知道:AOP代理實際上是由AOP框架動態生成的一個對象,該對象可做爲目標對象使用。AOP代理包含了目標對象的所有方法,但AOP代理中的方法與目標對象的方法存在差別:AOP方法在特定切入點增長了加強處理,並回調了目標對象的方法。
Spring的AOP支持
Spring中AOP代理由Spring的IoC容器負責生成、管理。其依賴關係也由IoC容器負責管理。所以AOP代理能夠直接使用容器中的其餘Bean做爲目標,這種關係可由IoC容器的依賴注入提供。Spring默認支持使用JDK動態代理來建立AOP代理,這樣就能夠爲任何接口實現建立代理了。
Spring也支持CGLIB代理,在須要代理類而不是代理接口的時候,Spring自動會切換爲使用CGLIB代理。但Spring推薦使用面向對象編程,所以業務對象一般都會實現一個或多個接口,此時默認將使用JDK動態代理,但也能夠強制使用CGLIB。
Spring AOP使用純Java實現。它不須要專門的編譯過程。Spring AOP不須要控制類裝載器的層次,所以它能夠在全部JavaWeb容器或應用服務器中運行良好。
Spring目前僅支持將方法調用做爲鏈接點(JoinPoint),若是須要把對Field的訪問和更新也做爲加強處理(Advice)的鏈接點,則能夠考慮使用AspectJ。
Spring實現AOP框架跟其餘的框架不一樣。Spring並非要提供最完整的AOP實現(儘管Spring AOP有這個能力),而是側重於AOP實現和Spring IoC之間的整合,用於幫助解決在企業級開發中的常見問題。所以,Spring一般和IoC容器一塊兒使用,Spring歷來就沒有經過提供一種全面的AOP解決方案來與AspectJ競爭。Spring AOP採用基於代理的AOP實現方案,而AspectJ則採用編譯時加強的解決方案。
Spring2.0能夠無縫的整合Spring AOP、IoC和AspectJ,是的全部的AOP應用徹底融入基於Spring的框架,這樣的集成不會影響Spring AOP API或者AOP Alliance API,Spring AOP保持了向下兼容性,依然容許直接使用Spring AOP API來完成AOP編程。
一旦咱們掌握了AOP的概念,不難發現進行AOP編程是一件很簡單的事情。縱觀AOP編程,其實須要程序員參與的只有三個部分:
定義普通的業務組件
定義切入點(PointCut),一個切入點可能橫切多個業務組件
定義加強處理(Advice),加強處理及時在AOP框架爲普通業務組件織入時的處理動做
第一部分是最爲日常的事情了,無需說明。第2、三部分就是AOP的關鍵:一旦定義了合適的切入點和加強處理,AOP框架將會自動生成代理,而AOP代理的方法大體有以下公式:
代理對象的方法 = 加強處理 + 被代理對象的方法
Spring 1.x採用自身提供的AOP API來定義切入點和加強處理,程序能夠直接使用Spring AOP API來定義切入點和加強處理,但這種方式彷佛有些過期了,如今一般建議使用AspectJ方式來定義切入點和加強處理,在這種方式下,Spring依然有以下兩種選擇來定義切入點和加強處理:
基於註解的配置方式:使用@Aspect ,@Pointcut等註解來標註切入點和加強處理
基於XML配置文件的方式
【未完,待續】