BeanFactory getBean 流程:getBean -> doGetBean -> getSingleton -> singletonFactory.getObject() -> createBean ->doCreateBean->initializeBean
1. getSingleton
從緩存中獲取已經(jīng)創(chuàng)建的單例bean暂吉,或者是返回一個 early reference匾灶,從而新創(chuàng)建一個bean
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
2. doGetBean
不同的scope生成bean的策略不同
protected <T> T doGetBean(){
// 查看是否緩存在 singletonObjects 中
Object sharedInstance = getSingleton(beanName);
//如果不為空,則直接返回緩存中
if (sharedInstance != null && args == null) {
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}else {
//如果未能在緩存中找到bean蒙挑,需要根據(jù)bean的scope新建一個bean
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
return createBean(beanName, mbd, args);
}
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}else if (mbd.isPrototype()) {
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); }
else {
createBean(beanName, mbd, args);
...
}
}
}
3. createBean
給BeanPostProcessor一個創(chuàng)建并返回代理bean的機(jī)會
protected Object createBean(){
// 生成BeanPostProcessor的代理類
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
...
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
return beanInstance;
4. doCreateBean
真正的實(shí)例化從這里開始
protected Object doCreateBean(){
BeanWrapper instanceWrapper = null;
//創(chuàng)建BeanWrapper實(shí)例:實(shí)例化bean
instanceWrapper = createBeanInstance(beanName, mbd, args);
// 初始化bean
Object exposedObject = bean;
//為bean添加屬性
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
...
return exposedObject;
}
5. initializeBean
該方法完成了bean的實(shí)例化:調(diào)用bean的初始化方法:afterPropertiesSet方法蔗牡;調(diào)用PostBeanProcessor的方法生成了增強(qiáng)的bean肾扰。
protected Object initializeBean(){
//觸發(fā)aware 接口的set方法
invokeAwareMethods(beanName, bean);
// PostBeanProcessor方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
//調(diào)用初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
return wrappedBean;
}