spring bean 的生命周期一览

本文详细探讨了Spring Bean的生命周期,从setBeanName开始,包括setApplicationContext的执行流程,以及@PostConstruct注解的处理。文章揭示了初始化过程中各种 Aware 接口的执行顺序,并解释了如何通过Ordered接口确保注解的优先执行。最后,文中提到了初始化结束后的销毁流程,特别是@PreDestroy注解的执行时机。
摘要由CSDN通过智能技术生成

我们就从最先执行的setBeanName开始一览,spring bean 的生命周期

setBeanName 的执行流程

先看一波 debug 栈的截图

setBeanName-debug

先是registerBeanPostProcessors这个都熟悉,接下来是 getBean相关的,不关心,我们关心初始化的时候干了嘛,那就从 createBean 开始看起,一定要记着这个时候类的构造方法已经调用过了哦。

createBean方法开始有很多 check ,接着下面这句,猜测是跟代理初始化相关的,我们没添加代理,先放过

// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

然后,进入doCreateBean方法,这个方法我们还是直奔 debug 指示的initializeBean方法,其中1783 行的invokeAwareMethods方法里面执行了我们关心的setBeanName方法。仔细的浏览一下这个方法:

private void invokeAwareMethods(final String beanName, final Object bean) {
   
		if (bean instanceof Aware) {
   
			if (bean instanceof BeanNameAware) {
   
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
   
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
   
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {
   
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

同时发现不仅setBeanName在这里执行,还有setBeanClassLoadersetBeanFactory也是在这里执行的

再回到doCreateBean方法,往下翻会发现下面这行

// Register bean as disposable.
registerDisposableBeanIfNecessary(beanName, bean, mbd);

点进去看看这里面其实会注册 DisposableBean interface, 自定义的 destroy method。

而这些都是在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory这个类里面

setApplicationContext执行流程

再看看setApplicationContext的执行流程和 setBeanName有何不同
setApplicationContext-debug
同样的也是从registerBeanPostProcessors开始,一直到initializeBean,和上面的 setBeanName 都是一样的,只不过这次是到了 1788 行的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization方法,看看这个方法实现

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {
   

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
   
			Object current = processor.postProcessBeforeInitialization
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值