Spring中bean的實例化過程


1.從緩存中。優先從一級緩存中拿,有則返回。 如果沒有,則從二級緩存中獲取,有則返回。 如果二級緩存中拿不到,則從三級緩存中拿,能拿到,則從三級緩存中刪除,移到二級緩存。

如果三級緩存也沒有,則返回null.

2. 如果是單例模式, 則走createBean 的流程,進行bean對象的實例化。

  2.1 獲取到該beanDefinition對應的字節碼對象。

 2.2 prepareMethodOverrides。 檢查beanDefinition對象的每一個methodOverride的對象。如果該對象對應的同名的方法只有一個則設置為false, 默認設置為true.

 2.3 調用doCreateBean 方法,進行具體的實例化過程。

3. 

 3.1 如果是單例的,則從bean工廠的實例緩存中獲取bean對象。

if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
3.2 如果獲取到的為空, 則進行bean對象的實例化創建。調用createBeanInstance
if (instanceWrapper == null) {
//創建實例,,重點看,重要程度:5
instanceWrapper = createBeanInstance(beanName, mbd, args);
}

3.3如果有FactoryMethodName屬性,則通過factorymethod 方法進行對象的實例化。
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}

3.4 否則,
尋找當前正在實例化的bean中有@Autowired注解的構造函數
// 調用SmartInstantiationAwareBeanPostProcessor類型的beanpostProcess.determineCandidateConstructors 獲取有autowired和value注解的構造器。
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

3.5
//如果ctors不為空,就說明構造函數上有@Autowired注解, 則通過構造函數進行初始化。
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
//如果ctors不為空,就說明構造函數上有@Autowired注解
return autowireConstructor(beanName, mbd, ctors, args);
}

3.6 如果首選的構造器不為空, 則使用首選的構造器進行實例化,以及進行以來注入
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}

3.7 否則調用無參構造函數進行bean的實例化。
//無參構造函數的實例化,大部分的實例是采用的無參構造函數的方式實例化,並包裝成一個BeanWrapper 對象進行返回。
return instantiateBean(beanName, mbd);

4. 調用applyMergedBeanDefinitionPostProcessors。主要是對實現了MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition方法調用。
主要的實現類有:

4.1 AutowiredAnnotationBeanPostProcessor。在postProcessMergedBeanDefinition方法中實現對Autowired,Value注解的注解信息收集,封裝到externallyManagedConfigMembers。
    4.2  CommonAnnotationBeanPostProcessor。 在postProcessMergedBeanDefinition方法中實現對@PostConstrutor 和 @ PreDestory ,@Resource 注解的信息收集,封裝到externallyManagedConfigMembers。
5. 檢查是否允許循環依賴,以及是否是單例模式。滿足條件的話,從二級緩存中移除,並且添加到三級緩存中。
6.進行屬性的注入,調用populateBean 方法。
6.1 根據注入的模式,進行對應屬性的字段,filed ,以及method依賴的解析。獲取其依賴的對象的值。
6.2 調用實現了InstantiationAwareBeanPostProcessor接口的postProcessProperties 方法,對有autowired,value,resource 注解的屬性實現屬性值的注入。
AutowiredAnnotationBeanPostProcessor中實現對autowired,value 屬性的注入。
在CommonAnnotationBeanPostProcessor中實現對resource 屬性的注入。
6.3 調用applyPropertyValues 方法,實現對<property/> 標簽的屬性值的解析。

7.調用bean的
initializeBean方法,完成bean 實例化過程的后續操作。

7.1 調用invokeAwareMethods 方法。根據是否實現了 一系列的aware 接口,調用其對應的方法
7.2 調用BeanPostProcessor接口的postProcessBeforeInitialization方法。進行bean初始化的前期方法調用。對 initmethod,,afterpeoperties, postcontructor 方法調用。

  1.InitDestroyAnnotationBeanPostProcessor中實現對@PostContrustor注解標識的方法進行調用

                2.調用實現了InitializingBean 接口的afterpropertiesSet 方法。
                3.調用指定了init-method屬性的方法。

     7.3  調用applyBeanPostProcessorsAfterInitialization方法,實現對BeanPostProcessor的postProcessAfterInitialization的方法的調用(TODO 這一個涉及到AOP的實現。后續完善。)

  

8.調用 registerDisposableBeanIfNecessary 方法。實現spring容器銷毀時,bean 對象銷毀是的操作注冊。










 
 


免責聲明!

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



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