news 2026/4/17 21:39:42

Spring的生命周期管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring的生命周期管理

1. Spring Bean 生命周期概述

Spring Bean 生命周期是指 Spring 容器从创建一个 Bean 实例到销毁 Bean 实例这一过程中的一系列操作。整个生命周期包含以下几个关键阶段:

  • Bean 实例化
  • 属性注入
  • 初始化
  • 销毁

每个阶段中,Spring 提供了钩子方法、回调接口以及容器事件来帮助开发者管理这些过程。


2. Bean 实例化

Spring 容器在启动时会根据配置文件或注解定义的 Bean 来创建实例。BeanFactory是 Spring 的最基本容器,它负责 Bean 的创建。

2.1 BeanFactory 通过反射创建 Bean

Spring 使用反射机制来创建 Bean 实例。通常,BeanFactory实现类(如DefaultListableBeanFactory)会通过getBean方法来查找和创建 Bean。

关键源码
  • getBean方法:查找并创建指定的 Bean。
  • createBean方法:通过反射创建 Bean 实例。

3. 属性注入

在 Spring 的生命周期中,属性注入是紧随 Bean 实例化之后的步骤。Spring 支持多种方式的依赖注入,包括构造器注入、Setter 注入和字段注入。

3.1 依赖注入的执行

Spring 会根据配置自动注入 Bean 的依赖。AutowireCapableBeanFactory是负责执行依赖注入的核心接口。

关键源码
  • autowireBeanProperties方法:根据不同的模式(按类型或按名称)自动注入依赖。

4. 初始化阶段

Bean 实例化并注入属性后,Spring 会调用初始化方法。Spring 提供了多种机制来定制初始化过程,包括@PostConstruct注解、InitializingBean接口以及init-method配置。

4.1@PostConstruct注解

@PostConstruct注解用于标注 Bean 初始化方法,该方法会在 Bean 完成属性注入之后、容器完全初始化之前执行。

关键源码
  • Spring 会扫描@PostConstruct注解并调用相应的方法。
4.2InitializingBean接口

InitializingBean接口定义了一个afterPropertiesSet方法,用于在属性注入完成后执行自定义的初始化逻辑。

关键源码
  • afterPropertiesSet方法:在属性注入后被自动调用。
4.3init-method配置

除了注解和接口,还可以在 XML 配置文件中通过init-method属性指定一个初始化方法。

关键源码
  • 在 XML 配置文件中通过init-method属性指定初始化方法。

5. 销毁阶段

Spring 中的销毁阶段是 Bean 生命周期的最后一步。当容器关闭时,Spring 会调用 Bean 的销毁方法。销毁方法可以通过@PreDestroy注解、DisposableBean接口或destroy-method配置来实现。

5.1@PreDestroy注解

@PreDestroy注解用于标注销毁方法,在 Bean 销毁之前执行。

关键源码
  • Spring 会在容器关闭时扫描@PreDestroy注解并调用销毁方法。
5.2DisposableBean接口

DisposableBean接口定义了destroy方法,当容器销毁 Bean 时,该方法会被调用。

关键源码
  • destroy方法:在容器销毁时被自动调用。
5.3destroy-method配置

在 XML 配置文件中,可以通过destroy-method属性指定销毁方法。

关键源码
  • 在 XML 配置文件中通过destroy-method属性指定销毁方法。

6. Spring Bean 生命周期的执行流程

整个 Bean 的生命周期包括实例化、属性注入、初始化和销毁,每个阶段会触发不同的回调接口和注解,开发者可以在这些阶段插入自定义的业务逻辑。

6.1 执行流程
  1. 实例化:通过反射创建 Bean 实例。
  2. 属性注入:通过AutowireCapableBeanFactory实现自动注入。
  3. 初始化
    • 如果有@PostConstruct注解,则调用相应的方法。
    • 如果实现了InitializingBean,则调用afterPropertiesSet
    • 如果在 XML 配置文件中定义了init-method,则调用该方法。
  1. 销毁
    • 如果有@PreDestroy注解,则调用相应的方法。
    • 如果实现了DisposableBean接口,则调用destroy
    • 如果在 XML 配置文件中定义了destroy-method,则调用该方法。

7. 生命周期管理的扩展机制

Spring 的生命周期管理非常灵活,可以通过多种方式扩展生命周期的管理,例如使用 AOP 进行生命周期增强、使用事件监听来响应生命周期的不同阶段等。

7.1 通过 AOP 增强生命周期

Spring 提供了基于 AOP 的生命周期增强机制,可以在 Bean 的生命周期中插入自定义逻辑。

关键源码

java复制

@Aspect public class LifecycleAspect { @Before("execution(* com.example.MyBean.init(..))") public void beforeInit() { // 在初始化之前执行逻辑 } @After("execution(* com.example.MyBean.destroy(..))") public void afterDestroy() { // 在销毁之后执行逻辑 } }
  • 使用 AOP 在 Bean 的初始化和销毁时执行额外的逻辑。

总结

Spring Bean 生命周期管理是 Spring 框架的核心特性之一,通过实例化、属性注入、初始化和销毁四个阶段,Spring 提供了灵活的机制来管理 Bean 的生命周期。开发者可以通过注解(如@PostConstruct@PreDestroy)、接口(如InitializingBeanDisposableBean)以及配置(如init-methoddestroy-method)来定制化 Bean 的生命周期行为。此外,通过 AOP 和事件监听机制,开发者还可以进一步扩展生命周期管理,实现更复杂的业务逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 19:41:33

13 秒插入 30 万条数据,这才是批量插入正确的姿势!

01 30万条数据插入数据库验证 验证的数据库表结构如下: CREATETABLEt_user ( idint(11) NOTNULL AUTO_INCREMENT COMMENT用户id, usernamevarchar(64) DEFAULTNULLCOMMENT用户名称, ageint(4) DEFAULTNULLCOMMENT年龄,PRIMARY KEY (id) ) ENGINEInnoDBDEFAULTCHAR…

作者头像 李华
网站建设 2026/4/18 7:24:04

RAG 深度实践系列(六):基于科大讯飞 RAG + 星火知识库的企业级实战指南

目录一、 企业级 RAG 的落地挑战与科大讯飞的生态赋能1.1、 讯飞开放平台:RAG 的“大脑”与“算力”底座1.2、 星火知识库:私域知识向量化的工程实现二、 工程实践2.1、 应用创建与密钥管理2.2、 接口鉴权认证的底层逻辑与时间戳偏移处理2.3、 文档管理流…

作者头像 李华
网站建设 2026/4/16 16:58:36

计算机毕业设计之基于springboot的学测评系统设计与实现

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了学…

作者头像 李华
网站建设 2026/4/18 7:02:50

基于单片机的酒精监测系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 概要 一、总方案设计2.1 分析2.2 酒精浓度监测系统方案 二、硬件设计报警电路 三、系统电路设计4.2 主程序框图 四、 总结 概要 近年来,车祸惨案频频发…

作者头像 李华
网站建设 2026/4/18 5:31:15

NLIS01控制器模块

NLIS01 控制器模块简介NLIS01 控制器模块用于工业控制系统中,负责执行控制逻辑、处理现场数据,并协调各功能模块的运行。作为系统核心控制单元,负责逻辑运算与控制决策支持多种控制策略,满足不同工艺需求数据处理速度快&#xff0…

作者头像 李华