1.從緩存中。優先從一級緩存中拿,有則返回。 若是沒有,則從二級緩存中獲取,有則返回。 若是二級緩存中拿不到,則從三級緩存中拿,能拿到,則從三級緩存中刪除,移到二級緩存。spring
若是三級緩存也沒有,則返回null.緩存
2. 若是是單例模式, 則走createBean 的流程,進行bean對象的實例化。app
2.1 獲取到該beanDefinition對應的字節碼對象。ide
2.2 prepareMethodOverrides。 檢查beanDefinition對象的每個methodOverride的對象。若是該對象對應的同名的方法只有一個則設置爲false, 默認設置爲true.函數
2.3 調用doCreateBean 方法,進行具體的實例化過程。post
3. this
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的實現。後續完善。)rem
8.調用 registerDisposableBeanIfNecessary 方法。實現spring容器銷燬時,bean 對象銷燬是的操做註冊。