【Spring Bean的生命周期】

大致分为3个阶段:创建、使用、销毁
创建可详细分为:实例化、初始化、注册destruction回调

创建流程主要在AbstractAutowireCapableBeanFactory这个类中
销毁流程主要在DisposableBeanAdapter这个类中

1、创建

源码找到AbstractAutowireCapableBeanFactory类

1、实例化Bean

  • 方法createBeanInstance
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		if (instanceWrapper == null) {
			// 根据指定bean使用对应的策略创建新的实例 
			// 如: 工厂方法 构造函数自动注入 简单初始化
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		Object bean = instanceWrapper.getWrappedInstance();
		...
		if (earlySingletonExposure) {
			...
			// 避免循环依赖, 在bean初始化完成前 将创建实例的ObjectFactory加入三级缓存
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}
	}

}

这里插一句:实例化后会将beanName、beanDefinition、beanInstance封装成一个bean对象工厂放进三级缓存,其实就是一个函数式接口实现类,后面遇到循环依赖就会从缓存中获取beanInstance

2、设置属性

  • 方法populateBean
    这一步主要就是填充bean,简单讲就是set各种属性,发现循环依赖就会递归初始化依赖的bean
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		//装配bean 将各个属性注入其中 可能存在依赖其他bean的属性则会递归初始化依赖的bean
		populateBean(beanName, mbd, instanceWrapper);
	}

	protected void populateBean(...) {
		...
		// 根据beanName注入
		if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
			autowireByName(beanName, mbd, bw, newPvs);
		}
		// 根据beanType注入
		if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
			autowireByType(beanName, mbd, bw, newPvs);
		}
		...
	}
}

3、检查Aware接口实现

  • 方法invokeAwareMethods (initializeBean方法中调用)
    检查当bean是否实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口,spring会自动帮我们调用这些接口的实现方法
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	
	protected Object initializeBean(...) {
		//对bean的特殊处理执行aware beanClassLoaderAware beanFactoryAware
		invokeAwareMethods(beanName, bean);
	}
}

4、BeanPostProcessor前置处理

  • 方法applyBeanPostProcessorsBeforeInitialization (initializeBean方法中调用)
    检查当bean是否实现了BeanPostProcessor接口, 并执行postProcessBeforeInitialization方法对当前bean进行处理
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	
	protected Object initializeBean(...) {
		//后置处理器
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}
}

5、InitializingBean (这一步可以理解为 依赖注入 完之后, 你希望spring帮忙执行的一些逻辑)

  • 方法afterPropertiesSet initializeBean方法 -> invokeInitMethods方法中调用
    检查当bean是否实现了InitializingBean接口, 并执行afterPropertiesSet方法, 比如你可以用这个接口实现一个策略工厂, 将一个接口所有的实现类封装进一个工厂的Map中
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	
	protected Object initializeBean(...) {
		//激活用户自定义的initMethod方法
		invokeInitMethods(beanName, wrappedBean, mbd);
	}

	protected void invokeInitMethods(...) throws Throwable {
		//如果实现可InitializingBean接口 调用afterPropertiesSet方法
		((InitializingBean) bean).afterPropertiesSet();
	}
}

6、执行自定义的init-method方法

  • 方法invokeCustomInitMethod initializeBean方法 -> invokeInitMethods方法中调用
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	
	protected Object initializeBean(...) {
		//激活用户自定义的initMethod方法
		invokeInitMethods(beanName, wrappedBean, mbd);
	}

	protected void invokeInitMethods(...) throws Throwable {
		//执行用户自定义init方法
		invokeCustomInitMethod(beanName, bean, mbd, initMethodName);
	}
}

7、BeanPostProcessor后置处理

  • 方法applyBeanPostProcessorsAfterInitialization (initializeBean方法中调用)
    检查当bean是否实现了BeanPostProcessor接口, 并执行postProcessAfterInitialization方法对当前bean进行处理
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	
	protected Object initializeBean(...) {
		//应用后处理器
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
}

到这里这个bean其实已经可用了

8、注册destruction回调

  • 方法registerDisposableBeanIfNecessary
    检查当前bean是否实现了DisposableBean接口或自定义了销毁方法,spring容器会给当前bean注册一个销毁回调 (在容器关闭的时候执行这段逻辑)
public abstract class AbstractAutowireCapableBeanFactory extends... {

	protected Object doCreateBean()throws BeanCreationException {
		...
		//根据scope注册bean 如果实现了了destroy-method 这里就会注册以便销毁的时候调用
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
}

2、使用

以上8步走完这个bean就完全初始化好了, 此时就可以使用了

3、销毁

源码找到DisposableBeanAdapter

容器关闭的时候会执行DisposableBeanAdapter#destroy()方法

  • DisposableBean接口的destroy方法
  • 配置文件中配置的destory-method方法

主要执行这两个方法中的逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值