本文主要对下面这个方法,这里是创建Bean的地方,在这里面经过一系列的操作最终生成了原始的Bean实例。
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
1.实例化Bean
instanceWrapper = createBeanInstance(beanName, mbd, args);
实例化Bean的过程主要是将BeanDefinition转换为BeanWrapper的过程。 BeanWrapper是一个对Bean进行包装的接口,它封装了一些Bean的行为和属性,用来操作Bean。createBeanInstance这个方法的主要作用就是根据BeanDefinition的配置,通过默认构造方法、工厂方法或者带参数的构造方法将BeanDefinition转换为BeanWrapper的过程。主要分为三步:
- 解析出所需的构造函数和参数
- 将解析好的构造函数放入缓存
- 实例化策略,如果有需要覆盖或者动态替换的方法则使用动态代理,否则直接反射即可
2.依赖处理
经过第一步之后的Bean只是一个空壳子,我们还需要对其进行属性填充,但是在这之前,为了避免出现循环依赖的问题,需要先判断是否需要提前曝光,如果需要曝光的话就会先在Bean初始化完成前将创建实例的ObjectFactory进行曝光,避免依赖问题。
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
//是否需要提早曝光:单例&允许循环依赖&当前bean正在创建中,检测循环依赖
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isDebugEnabled()) {
logger.debug("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
//为避免循环依赖,在bean初始化完成前将创建实例的ObjectFactory假如工厂
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
在Spring中有一个专门的属性singletonsCurrentlyInCreation来记录Bean的加载状态,在bean创建前会记录在属性中,创建结束后移除,这样就可以判断是否正在加载。
3.属性填充
//对bean进行填充,如果有其他依赖则会递归初始依赖bean
populateBean(beanName, mbd, instanceWrapper);
在populateBean函数中提供了这样的处理流程:
- InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充
- 根据注入类型,提取依赖的bean,并统一存入PropertyValues中
- 应用 InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,在属性获取完毕填充前对属性再次处理
- 将所有PropertyValues中的属性填充至BeanWrapper中
4.初始化Bean
//调用初始化方法
exposedObject = initializeBean(beanName, exposedObject, mbd);
主要对init-method属性进行处理,程序员自定义部分
5.注册DisposableBean
主要处理destroy-method属性相关