Spring Bean的生命周期

Spring Bean 的生命周期是指从其被定义到最终被销毁的整个过程,具体如下:

1. 元信息配置阶段

这是 Bean 信息的定义阶段。Spring 容器启动时,不管是通过 XML 配置文件中的<bean>标签,还是使用注解(如@Bean@Component及其衍生注解@Service@Repository@Controller),亦或是扫描得到的类,最终都会被解析成 Spring 内部的BeanDefinition结构。BeanDefinition包含了 Bean 定义的各种信息,如对应的 Class、作用域(scope,如 singleton、prototype )、是否延迟初始化(lazy)、依赖关系(depend on)、是否为自动注入候选者(autowire candidate)、是否为主要候选者(primary)等。

2. 元信息解析阶段

将各种方式定义的 Bean 配置信息解析为BeanDefinition对象,以便后续 Spring 容器根据这些信息对 Bean 进行操作。

3. 注册到容器阶段

把解析好的BeanDefinition注册到 Spring 容器中,这样容器才能管理这些 Bean。

4. BeanDefinition合并阶段

对于有继承关系的BeanDefinition,进行合并操作,确保最终使用的是完整且正确的 Bean 定义信息。

5. 类加载阶段

Spring 容器根据BeanDefinition中的类信息,加载对应的 Bean 类到 JVM 中。

6. 实例化阶段

  • 实例化前:在真正创建 Bean 实例之前,如果有相关的前置处理逻辑,会在这个阶段执行。
  • 实例化:Spring 容器利用 Java 反射机制创建 Bean 的实例。对于单例 Bean,容器会保证在整个应用中只有一个实例;对于原型 Bean,每次请求都会创建一个新的实例。

7. 合并后的BeanDefinition处理阶段

对实例化后的相关BeanDefinition信息进行进一步处理。

8. 属性赋值阶段

  • 实例化后:实例化完成后,在属性赋值前的一些处理操作。
  • 属性赋值前:为属性赋值做准备。
  • 属性赋值:Spring 容器通过调用 Setter 方法等方式,将 Bean 的属性值注入到对应的属性中,属性值可以通过 XML 配置或注解来指定。

9. 初始化阶段

  • Aware 接口回调:如果 Bean 实现了Aware系列接口(如BeanNameAwareBeanFactoryAwareApplicationContextAware等),Spring 容器会回调相应的方法,让 Bean 获取到容器相关的信息。
  • 初始化前:在自定义的初始化方法调用之前,可能会有一些前置处理逻辑。
  • 初始化:调用在配置文件或注解中定义的 Bean 的初始化方法(如通过@PostConstruct注解标注的方法,或实现InitializingBean接口的afterPropertiesSet方法 ),进行一些初始化操作,如资源的加载、连接的建立等。
  • 初始化后:初始化方法调用之后的一些后置处理操作,例如 Spring AOP 在此阶段会为 Bean 创建代理对象(如果需要的话)。

10. 所有单例 Bean 初始化完成后阶段

当所有的单例 Bean 都完成初始化后,Spring 容器会发布相应的事件,用于通知应用中监听该事件的组件。

11. 使用阶段

Bean 初始化完成后,就可以被其他组件获取和使用,执行业务逻辑。

12. 销毁前阶段

当 Bean 不再需要使用,并且 Spring 容器准备关闭时,对于单例 Bean,会进入销毁前阶段,做一些销毁前的准备工作。

13. 销毁阶段

如果 Bean 实现了DisposableBean接口,或者配置了自定义的销毁方法(如通过@PreDestroy注解标注的方法 ),Spring 容器会调用这些方法,释放 Bean 占用的资源,如关闭数据库连接、释放文件句柄等,完成 Bean 的销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值