spring創建aop代理對象流程分析

1.在實例化bean之後會調用AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法,該方法會找到所有實例化好的BeanPostProcessor對bean進行後置處理

2.AbstractAutoProxyCreator的postProcessAfterInitialization方法會調用wrapIfNecessary方法對當前bean進行判斷是否需要包裝。判斷的邏輯是首先找到容器裏的所有advisor,然後遍歷每一個advisor使用canApply方法去當前bean進行驗證是否可以作用用當前bean,不同的advisor有不同的驗證邏輯這裏就先不展開了。

3.通過getAdvicesAndAdvisorsForBean方法執行完之後返回advice和advisor類型的數組,如果數組不爲空則對當前bean進行包裝。下面既然createProxy方法。在這個方法裏最關鍵做兩件事1創建一個ProxyFactory,2找到當前AbstractAutoProxyCreator類中的其它interceptorNames加入specificInterceptors並對所有specificInterceptors進行包裝,包裝邏輯可以自己debug細究。

4.下面就調用ProxyFactory的getProxy方法獲取代理類。在getProxy方法裏會調用父類ProxyCreatorSupport的createAopProxy方法先獲取AopProxy實例。ProxyCreatorSupport類集成了一個AopProxyFactory實例用於抽象創建AopProxy實例方法,默認使用DefaultAopProxyFactory工廠生產AopProxy實例。在DefaultAopProxyFactory工廠里根據bean的class類型判斷是生產cglib的動態代理還是jdk的

5.這裏就看cglib的情況返回了ObjenesisCglibAopProxy對象。調用ObjenesisCglibAopProxy對象的getProxy方法時會調用其父類CglibAopProxy的的getProxy方法,在getProxy方法裏也就是實例化及初始化一個Enhancer對象還有就是獲取callback

 

6.最後就是調用子類ObjenesisCglibAopProxy的createProxyClassAndInstance方法通過kryo生成具體代理類並設置callback

 

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