Spring bean的生命周期

37 篇文章 0 订阅
15 篇文章 0 订阅
本文详细阐述了Spring中Bean的生命周期,从实例化、属性填充、 Aware接口处理、BeanPostProcessor扩展、初始化方法到销毁方法,展示了Bean从创建到销毁的完整过程,并介绍了Spring IoC容器对对象生命周期的管理。同时,提到了在面试中如何理解和掌握这些概念的重要性。
摘要由CSDN通过智能技术生成

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。

bean的声明
在这里插入图片描述
bean的声明有好几种,如上图。
上图声明的一些bean信息可以通过ClassPathXmlApplicationContext(bean.xml)进行加载解析配置信息

源码:

// Tell the subclass to refresh the internal bean factory.
//告诉子类刷新内部bean工厂,加载配置文件
//最重要的是创建BeanDefinition对象
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

加载解析配置信息后会封装成一个BeanDefinition对象(bean的定义信息),然后会根据bean的信息进行初始化,然后实例化,然后被使用,最后被销毁。

但是,Spring作为一个开源可扩展的基础框架,所以,在从配置信息解析出的bean的定义信息到实例化中间添加一些其他的可扩展操作。

在这里插入图片描述
此时会调用执行BeanFactoryPostProcessor做一些准备工作:

  • 准备beanPostProcessor
  • 准备监听器、事件、广播器

源码如下:

// Allows post-processing of the bean factory in context subclasses.
//允许在上下文子类中对bean工厂进行后处理。
//子类覆盖方法做额外的处理
//此处我们自己一般不做任何扩展工作,但是web中有具体是实现。
postProcessBeanFactory(beanFactory);

然后通过反射进行实例化,实例化时,所有的属性都是默认值,还未填充属性;会在初始化时进行属性的填充。而bean的实例化和初始化的整个过程就是bean的生命周期。

Spring中每个Bean的生命周期如下:
在这里插入图片描述
简述:getBean->实例化->填充属性->初始化
1、实例化bean

一、对于BeanFactory容器:当请求未初始化bean时,BeanFactory调用createBean()进行实例化。

二、对于ApplicationContext容器:当容器启动后,获取对象BeanDefinition信息,实例化所有Bean

2、设置对象属性(依赖注入)

实例化后的对象封装在BeanWrapper中,容器根据BeanDefinition中的信息和BeanWrapper对象提供的设置属性的接口完成依赖。

BeanDefinition实际上包括一些Bean的信息,比如BeanName, Scope, 是否被**@Primary注解修饰,是否是@Lazy**,以及**@Description**等注解

3、处理Aware接口
用户可以实现各种Aware接口进行自定义功能;在进行到此处,容器会调用Aware接口进行实现(比如BeanFactoryAware)

1、如果实现了BeanNameAware接口,会调用实现setBeanName(String beanId)方法,参数为spring中bean的id值

2、如果实现了BeanFactoryAware接口,会调用实现setBeanFactory()方法,传递spring工厂本身。

3、如果实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。

4、BeanPostProcessor
BeanPostProcessor可以根据次接口进行扩展功能,比如AOP

如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

5、InitializingBean和init-method

如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

6、如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;

以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。

7、DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

8、destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

我自己画了个图:
在这里插入图片描述
号外!号外!

最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。偶尔还有不定期的资料分享和红包发放!如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号​。

喜欢就分享
认同就点赞
支持就在看

一键四连,你的offer也四连图片

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1643817193
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术债务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值