從getSingleton方法開始:
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } });
其中的createBean方法中就有bean的處理器。
beanPostProcess只是頂層處理器,相當於一個最基本的后置處理器它會貫穿所有spring的bean初始化時的階段,會在initializationBean中調用。
實際上還有很多后置處理器的更多具體實現:
第一個方法:resolveBeforeInstantiation ,獲取所有后置處理器,判斷是否為InstantiationAwareBeanPostProcessor實現類型,調用的方法是:postProcessBeforeInstantiation
這個后置處理器很關鍵,InstantiationAwareBeanPostProcessor有3個方法,第一個方法postProcessBeforeInstantiation如果你直接返回一個“自建對象”的話,那spring上下文直接就會把你的這個對象放入容器中,並執行BeanPostProcessor的postProcessAfterInitialization方法。如果第一個方法返回為null,則spring創建bean的流程會繼續執行,會在populateBean方法中繼續調用postProcessAfterInstantiation和postProcessPropertyValues來進行屬性的裝配。
如果這里出現了aop的切面類,就會有InstantiationAwareBeanPostProcessor的子處理器進行類的過濾,出現@AspectJ的類標記為不需要代理的類,會被放入map中。
第二個方法:在createBeanInstance中的determineConstructorsFromBeanPostProcessors方法中,判斷是否為SmartInstantiationAwareBeanPostProcessor類型的后置處理器,調用的方法是:determineCandidateConstructors,這個方法用來推斷構造函數,實際使用的實現SmartInstantiationAwareBeanPostProcessor接口的AutowiredAnnotationBeanPostProcess后置處理器去做的。
第三個方法:在createBeanInstance中的applyMergedBeanDefinitionPostProcessors方法中,判斷為MergedBeanDefinitionPostProcessor,調用的方法是:postProcessMergedBeanDefinition,用來緩存注解信息。
第四個方法:在createBeanInstance中的getEarlyBeanReference方法中,判斷是否為SmartInstantiationAwareBeanPostProcessor,調用的方法是:getEarlyBeanReference
這個方法是來解決循環依賴問題的。這里很重要,要詳細的分析
第五個方法:在populateBean中的會調用InstantiationAwareBeanPostProcessor這個處理器,調用的方法是:postProcessAfterInstantiation
第六個方法:在populateBean中的又會調用InstantiationAwareBeanPostProcessor這個處理器,但是調用的方法是postProcessPropertyValues
第七個方法:在initializationBean中調用的是BeanPostProcess的postProcessBeforInitialization方法
第八個方法:在initializationBean中調用的是BeanPostProcess的postProcessAfterInitialization方法
第九個是銷毀時的方法