欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 深入解析 Spring Bean 的生命周期

深入解析 Spring Bean 的生命周期

2025/5/6 14:17:13 来源:https://blog.csdn.net/cooldream2009/article/details/143962288  浏览:    关键词:深入解析 Spring Bean 的生命周期

目录

  • 前言
  • 1. Spring Bean 的生命周期概述
  • 2. 创建阶段
    • 2.1 Bean 实例化
    • 2.2 依赖注入
  • 3. 初始化阶段
    • 3.1 执行 Aware 接口回调
    • 3.2 执行 `BeanPostProcessor.postProcessBeforeInitialization`
    • 3.3 执行初始化方法
    • 3.4 执行 `BeanPostProcessor.postProcessAfterInitialization`
  • 4. 使用阶段
  • 5. 销毁阶段
    • 5.1 执行 `DisposableBean` 回调
    • 5.2 执行 `@PreDestroy` 注解标记的方法
    • 5.3 执行 `destroy-method` 配置
  • 结语
  • 附件:Bean的生命周期简述

前言

Spring 是 Java 开发中最流行的框架之一,其中 Bean 的生命周期管理是其核心功能之一。通过 Spring 容器,我们可以方便地管理对象的创建、初始化、依赖注入、使用以及销毁过程。在 Spring 框架中,AbstractAutowireCapableBeanFactory 类的 doCreateBean() 方法对 Bean 生命周期的实现起到了关键作用。本文将围绕 Spring Bean 的生命周期展开,详细解析其生命周期各阶段的实现细节、相关机制和常见的使用场景。

1. Spring Bean 的生命周期概述

Spring Bean 的生命周期大致可以分为四个阶段:创建对象、初始化对象、使用对象、销毁对象。在这些阶段中,Spring 提供了多个扩展点,允许开发者通过接口、注解或配置灵活地定制 Bean 的行为。

  1. 创建阶段:通过构造方法或工厂方法实例化对象,并完成依赖注入。
  2. 初始化阶段:对 Bean 进行初始化操作,如回调 Aware 接口、执行初始化方法等。
  3. 使用阶段:在应用中按需使用 Bean。
  4. 销毁阶段:释放 Bean 的资源,执行销毁回调逻辑。

接下来,我们将对各个阶段展开详细解析。

在这里插入图片描述

2. 创建阶段

2.1 Bean 实例化

在 Spring 容器中,Bean 的实例化是通过 doCreateBean() 方法完成的。doCreateBean() 会根据 Bean 的定义信息(如作用域、构造方法、依赖属性等),选择适当的方式实例化对象,主要方式有以下两种:

  1. 构造方法实例化:使用默认构造方法或指定构造方法来创建对象。
  2. 工厂方法实例化:通过静态工厂方法或实例工厂方法返回 Bean 的实例。

在实例化阶段,Spring 通过 InstantiationAwareBeanPostProcessor 提供了一些钩子函数,让开发者可以在实例化之前和之后自定义逻辑,比如修改 Bean 的定义或直接返回一个代理对象。

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {// 解析并创建 Bean 实例BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);Object bean = instanceWrapper.getWrappedInstance();// 后续处理populateBean(beanName, mbd, instanceWrapper);initializeBean(beanName, bean, mbd);return bean;
}

2.2 依赖注入

依赖注入是创建阶段的核心步骤,Spring 通过以下几种方式实现:

  1. 构造器注入:通过构造方法参数完成依赖注入。
  2. Setter 注入:通过调用 Bean 的 Setter 方法注入依赖。
  3. 字段注入:通过 @Autowired@Resource 注解自动注入属性字段。

Spring 在注入依赖时,会先通过类型匹配找到合适的依赖,然后根据名称进行进一步过滤。当依赖关系较复杂时,开发者可以使用 @Qualifier 明确指定需要注入的 Bean。

3. 初始化阶段

初始化阶段的主要目的是对已创建的 Bean 进行进一步配置和增强。

3.1 执行 Aware 接口回调

Spring 提供了一些 Aware 接口,允许 Bean 获取容器中的上下文信息。常见的接口包括:

  • BeanNameAware:获取当前 Bean 的名称。
  • BeanFactoryAware:获取 BeanFactory 容器的引用。
  • ApplicationContextAware:获取 ApplicationContext 上下文。

这些接口的实现类会在初始化过程中被自动回调,为 Bean 提供对容器的访问能力。

3.2 执行 BeanPostProcessor.postProcessBeforeInitialization

Spring 允许通过实现 BeanPostProcessor 接口,在 Bean 初始化前后插入自定义逻辑。在初始化之前,postProcessBeforeInitialization 方法会被调用,用于对 Bean 做前置处理,例如添加代理逻辑或修改属性值。

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof SomeSpecificClass) {// 修改 Bean 的属性或行为}return bean;
}

3.3 执行初始化方法

  • @PostConstruct 注解:标记的方法会在依赖注入完成后自动执行。
  • InitializingBean 接口:实现 afterPropertiesSet() 方法,用于初始化逻辑。
  • init-method 配置:在 XML 文件或注解中指定初始化方法名称。

Spring 会按照以上顺序依次调用这些初始化方法,从而确保初始化逻辑的正确性和顺序性。

3.4 执行 BeanPostProcessor.postProcessAfterInitialization

在初始化完成后,Spring 会再次调用 BeanPostProcessorpostProcessAfterInitialization 方法,用于对 Bean 进行后置处理。常见的应用场景包括 AOP 切面代理的创建和动态增强。

4. 使用阶段

经过初始化的 Bean 会被注入到应用程序中,并在需要时被使用。在使用过程中,开发者只需通过依赖注入的方式获取 Bean,并调用其方法或操作属性即可。这一阶段的核心是通过 Spring 提供的 IOC(控制反转)机制,让对象的管理与使用解耦,提升代码的灵活性和可测试性。

5. 销毁阶段

当容器关闭时,Spring 会释放所有的 Bean,并执行销毁逻辑以清理资源。

5.1 执行 DisposableBean 回调

如果 Bean 实现了 DisposableBean 接口,则会调用其 destroy() 方法执行销毁逻辑,例如关闭数据库连接或释放文件资源。

5.2 执行 @PreDestroy 注解标记的方法

@PreDestroy 是 JSR-250 规范的一部分,用于在 Bean 销毁前执行清理操作。

5.3 执行 destroy-method 配置

如果在 Bean 配置中指定了 destroy-method 属性,则会调用对应的方法完成销毁逻辑。这种方式适用于无需实现接口的场景,灵活性更高。

<bean id="exampleBean" class="com.example.ExampleBean" destroy-method="cleanup"/>

在这里插入图片描述

Spring 提供了多种方式让开发者参与 Bean 生命周期的管理:

  • Aware 接口:获取容器相关信息。
  • BeanPostProcessor 接口:在初始化前后进行增强。
  • 注解和 XML 配置:灵活定制初始化和销毁逻辑。

合理利用这些扩展点,可以在不同场景中实现高度自定义的 Bean 行为。

结语

Spring Bean 的生命周期是框架核心之一,它涵盖了对象从创建到销毁的全过程,展示了 Spring 强大的容器管理能力。通过深入理解 Bean 的生命周期,开发者不仅可以更高效地使用 Spring 提供的功能,还能通过扩展点优化代码设计,提升系统的灵活性与可维护性。在实际开发中,建议结合具体场景选择合适的扩展机制,避免过度设计导致代码复杂度增加。

附件:Bean的生命周期简述

Bean的生命周期总的来说有4个阶段,分别有创建对象,初始化对象,使用对象以及销毁对象,而且这些工作大部分是交给Bean工厂的doCreateBean方法完成的

​ 首先,在创建对象阶段,先调用构造方法实例化对象,对象有了后会填充该对象的内容,其实就是处理依赖注入

​ 其次,对象创建完毕后,需要做一些初始化的操作,在这里涉及到几个扩展点。

  1. 执行Aware感知接口的回调方法

2.执行Bean后置处理器的postProcessBeforeInitialization方法

3.执行InitializingBean接口的回调,在这一步如果Bean中有标注了@PostConstruct注解的方法,会先执行它

4.执行Bean后置处理器的postProcessAfterInitialization

把这些扩展点都执行完,Bean的初始化就完成了

​ 接下来,在使用阶段就是程序员从容器中获取该Bean使用即可

​ 最后,在容器销毁之前,会先销毁对象,此时会执行DisposableBean接口的回调,这一步如果Bean中有标注了@PreDestroy接口的函数,会先执行它

简单总结一下,Bean的生命周期共包含四个阶段,其中初始化对象和销毁对象我们程序员可以通过一些扩展点执行自己的代码

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词