1. 程式人生 > >Spring原始碼解析(十三)——AOP原理——AnnotationAwareAspectJAutoProxyCreator

Spring原始碼解析(十三)——AOP原理——AnnotationAwareAspectJAutoProxyCreator

 * 2、 AnnotationAwareAspectJAutoProxyCreator:  *         AnnotationAwareAspectJAutoProxyCreator  *             ->AspectJAwareAdvisorAutoProxyCreator  *                 ->AbstractAdvisorAutoProxyCreator  *                     ->AbstractAutoProxyCreator  *                             implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware  *                         關注後置處理器(在bean初始化完成前後做事情)、自動裝配BeanFactory  *   * AbstractAutoProxyCreator.setBeanFactory()  * AbstractAutoProxyCreator.有後置處理器的邏輯;  *   * AbstractAdvisorAutoProxyCreator.setBeanFactory()-》initBeanFactory()  *   * AnnotationAwareAspectJAutoProxyCreator.initBeanFactory()  

 * 流程:  *         1)、傳入配置類,建立ioc容器

 *         2)、註冊配置類,呼叫refresh()重新整理容器;重新整理容器就是要把容器中的所有bean創建出來

 *         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);  * =======以上是建立和註冊AnnotationAwareAspectJAutoProxyCreator的過程========  *   *             AnnotationAwareAspectJAutoProxyCreator => InstantiationAwareBeanPostProcessor  *         4)、finishBeanFactoryInitialization(beanFactory);完成BeanFactory初始化工作;建立剩下的單例項bean  *             1)、遍歷獲取容器中所有的Bean,依次建立物件getBean(beanName);  *                 getBean->doGetBean()->getSingleton()->  *             2)、建立bean  *                 【AnnotationAwareAspectJAutoProxyCreator在所有bean建立之前會有一個攔截,InstantiationAwareBeanPostProcessor,會呼叫postProcessBeforeInstantiation()】  *                 1)、先從快取中獲取當前bean,如果能獲取到,說明bean是之前被建立過的,直接使用,否則再建立;  *                     只要建立好的Bean都會被快取起來  *                 2)、createBean();建立bean;  *                     AnnotationAwareAspectJAutoProxyCreator 會在任何bean建立之前先嚐試返回bean的例項  *                     【BeanPostProcessor是在Bean物件建立完成初始化前後呼叫的】  *                     【InstantiationAwareBeanPostProcessor是在建立Bean例項之前先嚐試用後置處理器返回物件的】  *                     1)、resolveBeforeInstantiation(beanName, mbdToUse);解析BeforeInstantiation  *                         希望後置處理器在此能返回一個代理物件;如果能返回代理物件就使用,如果不能就繼續  *                         1)、後置處理器先嚐試返回物件;  *                             bean = applyBeanPostProcessorsBeforeInstantiation():  *                                 拿到所有後置處理器,如果是InstantiationAwareBeanPostProcessor;  *                                 就執行postProcessBeforeInstantiation  *                             if (bean != null) {                                 bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);                             }  *   *                     2)、doCreateBean(beanName, mbdToUse, args);真正的去建立一個bean例項;和3.6流程一樣;  *                     3)、  *