關於Springboot Transactional cglib代理生成過程

一:候選代理器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管理了事物開啓、關閉、提交的狀態,下圖並未畫出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章