1. 程式人生 > 其它 >spring 5.2 Bean代理過程(六)

spring 5.2 Bean代理過程(六)

上一章節提到了代理,那麼spring如何實現代理的
先將物件初始化進行掃尾工作,呼叫initializeBean()

  1)繼承BeanNameAware、BeanClassLoaderAware、beanFactoryAware的子類,進行對應屬性注入
  2)處理繼承InitializingBean的子類afterPropertiesSet()方法或xml中配置的init-method方法
  3)處理所有BeanPostProcess的子類postProcessAfterInitialization()

spring開啟代理是需要註解或者xml的,因為需要引入兩個類中的一個:AspectJAwareAdvisorAutoProxyCreator或AnnotationAwareAspectJAutoProxyCreator,繼承關係,可以看出是在第三步的時候完成,

以AspectJAwareAdvisorAutoProxyCreator類為例:實現了postProcessAfterInitialization()

首先判斷當前物件是否滿足代理要求,如果不滿足結束
如果滿足,則呼叫 getAdvicesAndAdvisorsForBean()方法,獲取當前物件匹配中的advisor物件

如果沒有建立,則需要遍歷BeanDefinition找到所有Advisor介面的bean,並呼叫getBean()方法建立。

在Advisor物件中有一個屬性Advice物件,Advice在AOP中AbstractAspectJAdvice會有兩個屬性:pointcut(匹配規則),aspectJAdviceMethod(要執行的方法)
呼叫findAdvisorsThatCanApply()遍歷Advisor取出pointcut(匹配規則)與當前物件完全限定名+method方法名匹配,如果匹配中則加入代理

對最後選擇的Advisor進行擴充套件和排序,在createProxy方法中buildAdvisors()對advisor進行轉換

生成的位元組碼檔案,並返回代理物件,代理物件有一個重要屬性CGLIB$CALLBACK_0,這個屬性包含了當前物件所有資訊

當呼叫物件方法時,首先呼叫DynamicAdvisedInterceptor.intercept()

呼叫proceed()使用責任鏈模式完成所有的MethodInterceptor.invoke()和method.invoke()方法完成這個方法的執行過程