二、AOP原理-AnnotationAwareAspectJAutoProxyCreator分析(後置處理的註冊機創建)

1、 AnnotationAwareAspectJAutoProxyCreator繼承關係

AnnotationAwareAspectJAutoProxyCreator:
       AnnotationAwareAspectJAutoProxyCreator
            ->AspectJAwareAdvisorAutoProxyCreator
                 ->AbstractAdvisorAutoProxyCreator
                    ->AbstractAutoProxyCreator
                           implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
  關注後置處理器(在bean初始化完成前後做事情)、自動裝配BeanFactory


2、創建和註冊AnnotationAwareAspectJAutoProxyCreator的過程

 流程:
 *         1)、傳入配置類,創建ioc容器
 *         2)、註冊配置類,調用refresh()刷新容器;
 *         3)、registerBeanPostProcessors(beanFactory);註冊bean的後置處理器來方便攔截bean的創建;
 *             1)、先獲取ioc容器已經定義了的需要創建對象的所有BeanPostProcessor
 *             2)、給容器中加別的BeanPostProcessor
 *             3)、優先註冊實現了PriorityOrdered接口的BeanPostProcessor;
 *             4)、再給容器中註冊實現了Ordered接口的BeanPostProcessor;
 *             5)、註冊沒實現優先級接口的BeanPostProcessor;
 *             6)、註冊BeanPostProcessor,實際上就是創建BeanPostProcessor對象,保存在容器中;
 *                 創建internalAutoProxyCreator的BeanPostProcessor【AnnotationAwareAspectJAutoProxyCreator】
 *                 1)、創建Bean的實例
 *                 2)、populateBean;給bean的各種屬性賦值
 *                 3)、initializeBean:初始化bean;
 *                         1)、invokeAwareMethods():處理Aware接口的方法回調
 *                         2)、applyBeanPostProcessorsBeforeInitialization():應用後置處理器的postProcessBeforeInitialization()
 *                         3)、invokeInitMethods();執行自定義的初始化方法
 *                         4)、applyBeanPostProcessorsAfterInitialization();執行後置處理器的postProcessAfterInitialization();
 *                 4)、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)創建成功;--》aspectJAdvisorsBuilder
 *             7)、把BeanPostProcessor註冊到BeanFactory中;
 *                 beanFactory.addBeanPostProcessor(postProcessor);


3、斷點調試步驟

【AbstractApplicationContext--registerBeanPostProcessors】·

【PostProcessorRegistrationDelegate-registerBeanPostProcessors-getBean】

 

【AbstractBeanFactory-doGetBean-getSingleton】 

 【DefaultSingletonBeanRegistry-getSingleton】

【AbstractBeanFactory.doGetBean-doGetBean-createBean 】

【AbstractAutowireCapableBeanFactory.doCreateBean】

【AbstractAutowireCapableBeanFactory-invokeAwareMethods】

Aware接口處理

 

initializeBean-方法中,在執行完成Aware接口的處理後,BeanNameAware接口是爲了讓自身Bean能夠感知到,獲取到自身在Spring容器中的id屬性

【AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization】

 

 把BeanPostProcessor註冊到BeanFactory中

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