1. 程式人生 > >Spring原始碼解析(十四)——AOP原理——AnnotationAwareAspectJAutoProxyCreator執行時機

Spring原始碼解析(十四)——AOP原理——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);
                            }

它會在任何bean建立之前,嘗試攔截。


 * 
 *                     2)、doCreateBean(beanName, mbdToUse, args);真正的去建立一個bean例項;和3.6流程一樣;
 *                     3)、