此篇是補充上篇未分析完的finishBeanFactoryInitialization部分
配合上篇食用效果更佳緩存
Spring啓動過程——源碼分析bash
getBean進入doGetBean 下面四張圖都是
doGetBean.1 app
//先從緩存中取 第一次進來時沒有值的
Object singletonObject = this.singletonObjects.get(beanName);
//存在 則return
if(singletonObject!=null) return;
//解決循環依賴
beforeSingletonCreation(beanName);
//真正建立bean
singletonObject = singletonFactory.getObject();
afterSingletonCreation(beanName);
//加入緩存
addSingleton(beanName, singletonObject);
return singleObject
複製代碼
真正建立Bean是createBean() 若是是bean是多例源碼分析
//this.prototypesCurrentlyInCreation.set(beanName)
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
//this.prototypesCurrentlyInCreation.remove()
afterPrototypeCreation(beanName);
複製代碼
單例多例建立Bean都會調用到createBean post
//通常用於建立aop代理
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
//若是上邊沒有代理 這裏會真正開始建立
Object beanInstance = doCreateBean(beanName, mbdToUse, args)
複製代碼
createBean->resolveBeforeInstantiation ui
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
bp instanceof MergedBeanDefinitionPostProcessor -> bp.postProcessMergedBeanDefinition(mbd, beanType, beanName)this
爲剛剛實例化好的Bean進行屬性等賦值google
BeanWrapper爲null直接報錯或者returnspa
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
官方的解釋是:讓用戶能夠自定義屬性注入。好比用戶實現一 個 InstantiationAwareBeanPostProcessor 類型的後置處理器,並經過 postProcessAfterInstantiation 方法向 bean 的成員變量注入自定義的信息。固然,若是無 特殊需求,直接使用配置中的信息注入便可。另外,Spring 並不建議你們直接實現 InstantiationAwareBeanPostProcessor 接口,若是想實現這種類型的後置處理器,更建議 經過繼承 InstantiationAwareBeanPostProcessorAdapter 抽象類實現自定義後置處理器prototype
Field field = (Field) this.member;
ReflectionUtils.makeAccessible(field);
field.set(bean, value);
複製代碼
applyPropertyValues(beanName, mbd, bw, pvs);
將屬性應用到 bean 對象中
檢測屬性值列表是否已轉換過的,若轉換過,則直接填充屬性,無需再次轉換
遍歷屬性值列表 pvs,解析原始值 originalValue,獲得解析值 resolvedValue
對解析後的屬性值 resolvedValue 進行類型轉換
將類型轉換後的屬性值設置到 PropertyValue 對象中,並將 PropertyValue 對象存入 deepCopy 集合中
將 deepCopy 中的屬性信息注入到 bean 對象中
流程圖:
餘下的初始化工做
invokeInitMethods(beanName, wrappedBean, mbd)
FactoryBean一直都沒怎麼用過 因此本身寫了demo用下
@Autowired
private Student2 student2;
複製代碼
debug一下 查看下執行過程
此次Spring ioc源碼看了我好幾天,收穫仍是挺大的,也總結
最後關於Spring總結 主要按着下面四點去看 1)、Spring容器在啓動,先保存Bean定義信息
2)、Spring容器會在XX的狀況下建立Bean
3)、後置處理器 *每個Bean建立完成 會使用處理器處理
4)、事件驅動模型 *ApplicationListener 事件監聽 *ApplicationEventMulticaster 事件派發