一,概述
1. 原理:面向切面編程
從關(guān)注點中分離出橫切關(guān)注點右蕊,通俗點講,即將解決特定領(lǐng)域問題的代碼從業(yè)務(wù)邏輯中脫離出來茉兰。舉個栗子尤泽,簡單的增刪改中一般有事務(wù)管理,但事務(wù)管理與業(yè)務(wù)邏輯無關(guān),是一個特定重復的操作坯约,這個時候熊咽,我們就可以把事務(wù)管理從增刪改的業(yè)務(wù)邏輯中脫離出來。在這里闹丐,我們的關(guān)注點就是增刪改等業(yè)務(wù)邏輯横殴,橫切關(guān)注點就是事務(wù)管理。
2.1 Advice通知
- 作用:
- 描述Spring AOP圍繞方法調(diào)用而注入的切面行為卿拴。
- 類型(這里只列舉三種)
- BeforeAdvice:在目標實例的方法(即衫仑,JoinPoint:連接點)執(zhí)行前嵌入執(zhí)行額外功能。
- AfterAdvice:在目標實例的方法執(zhí)行后嵌入執(zhí)行額外功能堕花。
- ThrowAdvice:在目標實例的方法拋出異常時執(zhí)行Advice文狱。
2.2 Pointcut切點
決定Advice通知應該作用于哪個連接點。
2.3 Advisor通知器
用來結(jié)合Advice和Pointcut
二缘挽,Spring AOP實現(xiàn)的核心技術(shù)
動態(tài)代理
這里以JVM的動態(tài)代理模式舉例
-
圖解代理模式:
如圖3-9瞄崇,代理對象Proxy與目標對象RealSubject實現(xiàn)了同一個接口Subject。當調(diào)用目標對象的request()方法時壕曼,往往會被代理對象攔截苏研。通過這種攔截, 為目標對象的方法操作做了鋪墊腮郊,所以稱之為代理模式摹蘑。
三,建立AopProxy代理對象
1. 設(shè)計原理
ProxyFactory相關(guān)的類繼承關(guān)系:
- ProxyConfig:數(shù)據(jù)基類轧飞,為子類提供配置屬性
- AdvisedSupport:封裝了AOP對通知和通知器的相關(guān)操作
- ProxyCreatorSupport:子類創(chuàng)建AOP代理對象的輔助類衅鹿,繼承以上提到的基類的功能實現(xiàn)
- AspectJProxyFactory:具體的AOP代理對象的生成。集成Spring和AspectJ踪少。
- ProxyFactory:具體的AOP代理對象的生成塘安。為使用Spring AOP的應用提供AOP功能的封裝。需要編程式使用Spring AOP功能援奢。
- ProxyFactoryBean:具體的AOP代理對象的生成兼犯。為使用Spring AOP的應用提供AOP功能的封裝〖可以在IOC容器中完成聲明式配置切黔。
2. 配置ProxyFactoryBean
<!--配置ProxyFactoryBean-->
<!--1,定義使用的通知器Advisor-->
<bean id="testAdvisor" class="com.abc.TestAdvisor"/>
<!--2具篇,定義ProxyFactoryBean-->
<bean id="testAOP" class="org.springframework.aop.framework.ProxyFactoryBean"/>
<!--3纬霞,設(shè)定與AOP實現(xiàn)相關(guān)的重要屬性-->
<!--3.1,proxyInterface-->
<property name="proxyInterfaces"><value>com.test.AbcInterface</value></property>
<!--3.2驱显,target(目標對象)-->
<property name="target">
<bean class="com.abc.TestTarget"/>
</property>
<!--3.3诗芜,interceptorNames(需要定義的通知器)-->
<property name="interceptorNames">
<list><value>testAdvisor</value></list>
</property>
3. ProxyFactoryBean生成AopProxy代理對象
AopProxy的生成過程:兩種方式瞳抓,依賴JDK或者CGLIB提供的Proxy特性。
- initializeAdvisorChain():初始化通知器鏈伏恐,通知器鏈中封裝了一系列從配置中讀取的攔截器孩哑,為代理對象的生成做好準備。
- getSingletonInstance():生成Singleton類型的Proxy
- DefaultAopProxyFactory:AopProxy接口類翠桦,AopProxy有兩個子類實現(xiàn)横蜒,一個是JdkDynamicAopProxy,一個是CglibProxyFactory
4. JDK生成AopProxy代理對象
// JdkDynamicAopProxy生成Proxy代理對象
@Override
public Object getProxy(ClassLoader classLoader) {
if (logger.isDebugEnabled()) {
logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
}
// 1销凑,從advised對象中取得代理對象的代理接口配置
Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
// 2丛晌,調(diào)用JDK生成Proxy
return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}
- newProxyInstance方法:需要指明3個參數(shù),類裝載器斗幼,代理接口澎蛛,Proxy回調(diào)方法所在的對象,這個對象要實現(xiàn)InvocationHandler接口
- InvocationHandler接口: 反射類接口蜕窿,定義了invoke方法瓶竭,提供代理對象的回調(diào)入口。
5. CGLIB生成AopProxy代理對象
Cglib2AopProxy生成AopProxy代理對象
配置Enhancer對象渠羞,通過Enhancer對象的callback回調(diào)設(shè)置生成代理對象。其中通過設(shè)置DynamicAdvisedInterceptor攔截器來完成AOP功能的智哀。