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 對象銷毀是的操作注冊。