一:候選代理器candidateAdvisors的準備
當創建bean實例準備實例化initializeBean的時候,會進行後置處理器的調用,其中AbstractAdvisorAutoProxyCreator是特定bean構建AOP代理的通用自動代理創建器。而代理處理器是通過DefaultListableBeanFactory調用doGetBeanNamesForType方法主要判斷了Advisor.class.isAssignableFrom(Target.class)獲取的。
二:candidateAdvisors的選擇
這裏分析的是Transactional事物的Advisor的獲取,通過AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass);進行TransactionAttributes的緩存的獲取,其中TransactionAttributes的緩存信息都是通過SpringTransactionAnnotationParser使用AnnotatedElementUtils註解工具類對含有Transactional.class註解的類或方法進行解析的信息,其中key=MethodClassKey(Class+Method的封裝),value=TransactionAttribute。
三:代理工廠的創建
當獲取到了BeanFactoryTransactionAttributeSourceAdvisor之後,開始創建代理工廠ProxyFactory,ProxyFactory封裝了用於代理配置器BeanFactoryTransactionAttributeSourceAdvisor和被代理對象TargetSource,而TargetSource又是對直接的被代理對象的封裝,這樣多次封裝的好處就在於代碼的通用性,如TargetSource的實現類SingletonTargetSource的成員變量Object類型的target
四:AOP代理工廠的獲取
ProxyFactory實現了AdvisedSupport類,ProxyFactory默認的AopProxy是通過工廠DefaultAopProxyFactory來獲取的,由DefaultAopProxyFactory獲取的默認Aop代理 ObjenesisCglibAopProxy,即CGLIB proxy,創建的同時傳入了AdvisedSupport對象,這樣ObjenesisCglibAopProxy就包含了adviser和被代理class對象,根據此工廠中的設置創建新代理。
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
還有一個地方需要注意,ProxyFactory是每一個被代理類的包裝類工廠,工廠將作爲Cglib代理執行對象的執行類,也就是說,在調用代理對象的時候會調用具體被代理類當代理工廠ProxyFactory,其中代理工廠ProxyFactory的一個成員變量是DefaultAdvisorChainFactory對象,該對象作爲advisor執行鏈,當調用DefaultAdvisorChainFactory的getInterceptorsAndDynamicInterceptionAdvice方法的時候會遍歷advisor執行鏈找到代理對象的advise攔截器,添加到list列表返回。如事物列表將含有TransactionInterceptor事物攔截器
五:代理類的創建
ObjenesisCglibAopProxy繼承了CglibAopProxy,調用的getProxy也是CglibAopProxy裏的核心方法。
1:創建Enhancer對象,Enhancer enhancer = createEnhancer();
2:enhancer設置類加載器,被代理類、接口、Callback[]、naming策略等信息
這裏邊的AopCallback是CglibAopProxy靜態內部類DynamicAdvisedInterceptor,DynamicAdvisedInterceptor實現了MethodInterceptor的intercept方法。而Callback是個數組包含了多個AdviserdInteceptor和其他信息
Callback[] mainCallbacks = new Callback[] {
aopInterceptor, // for normal advice
targetInterceptor, // invoke target without considering advice, if optimized
new SerializableNoOp(), // no override for methods mapped to this
targetDispatcher, this.advisedDispatcher,
new EqualsInterceptor(this.advised),
new HashCodeInterceptor(this.advised)
};
3:創建代理類並返回代理類對象
六:代理類執行
如第四步分析,當執行到Cglib的callback(DynamicAdvisedInterceptor)的intercept時候,實例化CglibAopProxy靜態內部類CglibMethodInvocation,調用CglibMethodInvocation的proceed方法,通過proceed方法執行攔截器的invoke方法,以事物攔截器TransactionInterceptor分析:
DataSourceTransactionManager管理了事物開啓、關閉、提交的狀態,下圖並未畫出