spring的AOP基本原理
一、什么是AOP
AOP(Aspect Oriented Programming),意思是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP基于IoC基礎,是對OOP(Object Oriented Programming,面向對象)的延續。
二、基本概念
1、切面(Aspect):對橫切性關注點的模塊化,其實就是共有功能的實現。如日志切面、權限切面等。
2、連接點(JoinPoint):就是程序在運行過程中能夠插入切面的地點。例如,方法調用、異常拋出或字段修改等,但Spring只支持方法級的連接點。
3、通知(Advice):在切面的某個特定的連接點(Joinpoint)上執行的動作。通知有各種類型,其中包括"around"、"before”和"after"等通知。許多AOP框架,包括Spring,都是以攔截器做通知模型, 并維護一個以連接點為中心的攔截器鏈。
4、切入點(Pointcut):用于定義通知(Advice)應該切入到哪些連接點(JoinPoint)上。不同的通知通常需要切入到不同的連接點上,這種精準的匹配是切入點的正則表達式來定義的。
5、目標對象(Target):就是那些即將切入切面的對象,也就是那些被通知的對象。
6、代理對象(Proxy):將通知應用到目標對象之后被動態創建的對象??梢院唵蔚乩斫鉃椋韺ο蟮墓δ艿扔谀繕藢ο蟮暮诵?/span>業務邏輯功能加上共有能。代理對象對于使用者而言是透明的,是程序運行過程中的產物。
7、織入(Weaving):將切面應用到目標對象從而創建一個新的代理對象的過程。這個過程可以發生在編譯期、類裝載期及運行期,當然不同的發生點有不同的前提條件。譬如發生在編譯期的話,就要求有一個支持這種AOP實現的特殊編譯器;發生在類裝載期,就要求有一個支持AOP實現的特殊類裝載器;只有發生在運行期,則可直接通過Java語言的反射機制與動態代理機制來動態實現。
三、通知(Advice)類型
為了符合現實的各種需求,通知類型提供了5種,可以對目標方法進行全方位處理;
1、Before advice:在某連接點(JoinPoint)之前執行的通知,但這個通知不能阻止連接點前的執行。
ApplicationContext中在<aop:aspect>里面使用<aop:before>元素進行聲明。
2、After advice:當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
ApplicationContext中在<aop:aspect>里面使用<aop:after>元素進行聲明。
3、After returnadvice:在某連接點正常完成后執行的通知,不包括拋出異常的情況。
ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素進行聲明。
4、Around advice:包圍一個連接點的通知,類似Web中Servlet規范中的Filter的doFilter方法??梢栽诜椒ǖ恼{用前后完成自定義的行為,也可以選擇不執行。
ApplicationContext中在<aop:aspect>里面使用<aop:around>元素進行聲明。
5、Afterthrowing advice:在方法拋出異常退出時執行的通知。
ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素進行聲明。
四、AOP兩種代理的區別
AOP支持2種代理,Jdk的動態代理和CGLIB實現機制。二者有什么區別呢:
Jdk基于接口實現:JDK動態代理對實現了接口的類進行代理。
CGLIB基于繼承:CGLIB代理可以對類代理,主要對指定的類生成一個子類,因為是繼承,所以目標類最好不要使用final聲明。
通常情況下,鼓勵使用jdk代理,因為業務一般都會抽象出一個接口,而且不用引入新的東西。如果是遺留的系統,以前沒有實現接口,那么只能使用CGLIB。
五、AOP配置
Spring AOP配置有兩種風格:
XML風格 = 采用聲明形式實現Spring AOP
AspectJ風格 = 采用注解形式實現Spring AOP

浙公網安備 33010602011771號