Spring框架XML启动过程详解(四):创建Bean

文章详细阐述了Spring框架中Bean的创建过程,包括实例化、依赖处理、属性填充、初始化Bean以及注册DisposableBean等步骤,特别是如何处理循环依赖和自定义初始化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要对下面这个方法,这里是创建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的过程。主要分为三步:

  1. 解析出所需的构造函数和参数
  2. 将解析好的构造函数放入缓存
  3. 实例化策略,如果有需要覆盖或者动态替换的方法则使用动态代理,否则直接反射即可

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函数中提供了这样的处理流程:

  1. InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充
  2. 根据注入类型,提取依赖的bean,并统一存入PropertyValues中
  3. 应用 InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,在属性获取完毕填充前对属性再次处理
  4. 将所有PropertyValues中的属性填充至BeanWrapper中

4.初始化Bean

//调用初始化方法
			exposedObject = initializeBean(beanName, exposedObject, mbd);

主要对init-method属性进行处理,程序员自定义部分 

5.注册DisposableBean

主要处理destroy-method属性相关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值