spring的9個地方調用了5次后置處理器的詳細情況


從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方法

第九個是銷毀時的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM