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()方法完成這個方法的執行過程