Spring AOP三部曲之創(chuàng)建代理對象

什么是AOP?
AOP是一種編程范式,旨在通過允許分離橫切關注點來增加模塊化。他通過在不修改代碼本身的情況下向現(xiàn)有代碼添加額外的行為來實現(xiàn)這一點。
相反,我們可以分別聲明新方法和新行為。Spring的AOP框架幫助我們實現(xiàn)這些橫切關注點。

注意:本文是以5.2.3版本為講解。
步驟一:AutowireCapableBeanFactory類對容器生成的Bean添加后置處理器
在前兩篇關于“DI”的文章中,我們講到Spring對Bean屬性通過“populateBean()”方法是如何進行依賴注入的,今天我們講解通過“initializeBean()”方法是如何為Bean實例應用BeanPostProcessor后置處理器。

步驟二:為Bean實例對象添加BeanPostProcessor后置處理器的入口
初始化給定的bean實例,應用工廠回調以及init方法和beanPostProcessor后置處理器。從createBean調用定義的bean,從initializeBean調用現(xiàn)有bean實例。大致業(yè)務如下:
invokeAwareMethods:為Bean實例包裝相關屬性,如:bean名稱、Bean類加載器、bean工廠等。
applyBeanPostProcessorsBeforeInitialization:將 BeanPostProcessors 應用于給定的現(xiàn)有 bean 實例,調用它們的 postProcessBeforeInitialization 方法。返回的 bean 實例可能是當前bean的包裝后的bean。
invokeInitMethods:執(zhí)行初始化的方法,如果當前bean實現(xiàn)了InitializingBean接口就調用afterPropertiesSet()方法,如果是init-method屬性,就調用指定的方法
applyBeanPostProcessorsAfterInitialization:將 BeanPostProcessors 應用于給定的現(xiàn)有 bean 實例,調用它們的 postProcessAfterInitialization 方法。返回的 bean 實例可能是當前bean的包裝后的bean。

步驟三:調用BeanPostProcessor后置處理器實例對象初始化之前的處理方法
循環(huán)遍歷獲取所有的BeanPostProcessor后置處理器,調用所有的初始化前的處理方法

步驟四:調用BeanPostProcessor后置處理器實例對象初始化之后的處理方法
循環(huán)遍歷獲取所有的BeanPostProcessor后置處理器,調用所有的初始化后的處理方法

BeanPostProcessor有很多實現(xiàn)的子類,分別有不同的功能,而其中創(chuàng)建AOP代理對象的子類“AbstractAutoProxyCreator”,在這里我們繼續(xù)分析該類的postProcessAfterInitialization方法。
步驟五:選擇代理策略
大致業(yè)務如下:
判斷當前是否需要代理(即Advice類、Pointcut類、Advisor類、AopInfrastructureBean類),如果不需要,返回當前bean實例
getAdvicesAndAdvisorsForBean:獲取這個bean的advice集合
createProxy:創(chuàng)建代理


步驟六:獲取這個bean的advice集合


步驟七:創(chuàng)建AOP代理
大致業(yè)務如下:
buldAdvisors:確定給定bean的Advisor,包括特定的攔截器和公共攔截器,所有這些都適合Advisor接口。
getProxy:獲取指定的代理

步驟八:根據工廠的設置獲取代理
proxyFactory有JDK和CGLIB的,最終調用的是DefaultAopProxyFactory類的createAopProxy()方法


步驟九:為給定的AOP配置創(chuàng)建一個AopProxy
在這個方法里我們根據不同策略是使用JDK和CGLIB的代理。

時序圖

寫在最后
好兄弟可以點贊并關注我的公眾號“javaAnswer”,全部都是干貨。
