1 问题来源
spring
将 bean
的初始化和各个 bean
之间的关系交给了框架来处理,大大了简化了项目搭建的流程
- 但是在简化的同时也隐藏了
bean
之间初始化关系的流程
- 熟悉
bean
初始化的流程可以更好的把握项目运行的顺序,也能够更好的把握 spring
中的一些扩展点
2 bean 初始化流程
spring
启动的整个过程可以最简化为 两个步骤:
1)获取所有的 beanDefinition
2)遍历所有的 beanDefinition
,实例化相应的 bean
(非懒加载的 bean
)
public void refresh() {
this.invokeBeanFactoryPostProcessors(beanFactory);
this.finishBeanFactoryInitialization(beanFactory);
}
2.1 getBean->doGetBean->createBean
- 通过别名获取
beanName
- 判断缓存中是否已经存在此实例,如果有,打出相应日志
- 如果没有:按照
bean
的类型,分情况处理
- 将父类属性合并到此类中
- 递归初始化依赖类(这里是
xml
中定义的 depends-on
属性)
- 初始化该类
public Object getBean(String name, Object... args) throws BeansException {
return this.doGetBean(name, (Class)null, args, false);
}
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
String beanName = this.transformedBeanName(name);
Object sharedInstance = this.getSingleton(beanName);
Object bean;
if (sharedInstance != null && args == null) {
if (this.logger.isTraceEnabled()) {
if (this.isSingletonCurrentlyInCreation(beanName)) {
this.logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
} else {
this.logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
}
}
bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
} else {
if (this.isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
String[] dependsOn = mbd.getDependsOn();
if (mbd.isSingleton()) {
sharedInstance = createBean();
bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
} else if (mbd.isPrototype()) {
} else {
String scopeName = mbd.getScope();
Scope scope = (Scope)this.scopes.get(scopeName);
}
}
if (requiredType != null && !requiredType.isInstance(bean)) {
T convertedBean = this.getTypeConverter().convertIfNecessary(bean, requiredType);
return convertedBean;
} else {
return bean;
}
}
2.2 createBean->doCreateBean
- 设置
override
属性
- 调用所有
InstantiationAwareBeanPostProcessor
,做一些扩展
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
RootBeanDefinition mbdToUse = mbd;
mbdToUse.prepareMethodOverrides();
Object beanInstance;
beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
if (beanInstance != null) {
return beanInstance;
}
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
return beanInstance;
}
2.3 doCreateBean->(createBeanInstance,populateBean,initializeBean,registerDisposableBeanIfNecessary)
createBeanInstance
:通过策略创建bean包装实例——这里可能回去递归初始化构造器中参数的类
- 调用所有的
MergedBeanDefinitionPostProcessors
,一个扩展点
- 提前暴露引用,允许循环引用,一般为
true
populateBean
:注入依赖类和相关属性——这里递归初始化注解的依赖类
initializeBean
:调用初始化方法
registerDisposableBeanIfNecessary
:搬到 bean
销毁的方法
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
BeanWrapper instanceWrapper <