通俗易懂的讲解SpringBean生命周期

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

CSDN

文章目录

    • Bean生命周期
      • 1. 实例化阶段:创建Bean的“空壳”‌
      • 2. 属性注入阶段:给Bean“装配零件”‌
      • 3. Aware接口回调:让Bean“认识环境”‌
      • 4. BeanPostProcessor前置处理:统一“质检”‌
      • 5. 初始化阶段:激活Bean的“功能”‌
      • 6. BeanPostProcessor后置处理:最终“包装”‌
      • 7. 运行阶段:Bean正式“上岗”‌
      • 8. 销毁阶段:Bean的“善后工作”‌
    • 现实世界类比‌


Bean生命周期

[实例化] → [属性注入] → [Aware回调] → [BeanPostProcessor前置处理] → [初始化] → [BeanPostProcessor后置处理] → [就绪可用] → [销毁]

1. 实例化阶段:创建Bean的“空壳”‌

触发时机‌:当Spring容器启动,或首次请求某个Bean时。
核心动作‌:

  • 调用Bean的构造方法(如new UserServiceImpl()),生成一个“空壳”对象。
  • 若使用工厂方法(如@Bean标注的方法),则执行工厂方法返回对象。

典型场景‌:

  • 构造器中打印日志:“用户服务实例已创建”。
  • 若构造器中有资源预加载(如加载本地文件),此时会执行。

2. 属性注入阶段:给Bean“装配零件”‌

触发时机‌:实例化完成后,立即进行。
核心动作‌:

  • 通过@Autowired、@Value或XML的标签,给Bean的属性赋值。
  • 注入其他Bean(如Service注入DAO)、基本类型值(如端口号)、集合等。

典型场景‌:

  • 数据库连接池Bean在此阶段设置URL、用户名、密码。
  • 微服务中,Feign客户端Bean在此阶段注入负载均衡器。

3. Aware接口回调:让Bean“认识环境”‌

触发时机‌:属性注入完成后,初始化前。
核心动作‌:

  • Spring调用Bean实现的Aware接口方法,传递容器相关信息。

常见接口:

  • BeanNameAware‌ → 告知Bean它在容器中的名字(如userService)。
  • ApplicationContextAware‌ → 告知Bean它所属的Spring容器。
  • EnvironmentAware‌ → 让Bean获取环境变量(如开发/生产配置)。

典型场景‌:

  • 动态获取其他Bean:例如,支付服务通过ApplicationContextAware拿到容器,根据业务类型实时获取不同的支付处理器。
  • 读取环境变量:例如,根据EnvironmentAware判断当前是测试环境还是生产环境,切换日志级别。

4. BeanPostProcessor前置处理:统一“质检”‌

触发时机‌:Aware回调完成后,初始化逻辑执行前。
核心动作‌:

  • Spring遍历所有BeanPostProcessor,执行postProcessBeforeInitialization()方法。
  • 可对Bean进行‌修改‌(如替换属性值)或‌增强‌(如添加监控逻辑)。

典型场景‌:

  • 属性校验‌:检查数据库配置Bean的URL是否为空,若为空则抛出异常。
  • 日志标记‌:给所有Bean添加唯一ID,方便链路追踪。
  • 注解解析‌:解析@PostConstruct注解,为后续初始化做准备。

5. 初始化阶段:激活Bean的“功能”‌

触发时机‌:前置处理完成后。
核心动作‌(按顺序执行):

  • @PostConstruct注解方法‌:标记在Bean的某个方法上,Spring自动调用。例如:启动后加载缓存、注册监听器。
  • InitializingBean接口的afterPropertiesSet()‌:接口定义的初始化方法,Spring自动调用。例如:数据库连接池在此方法中创建物理连接。
  • 自定义init-method‌:通过XML或@Bean(initMethod=“init”)指定的初始化方法。例如:启动后台线程、初始化计数器。

典型场景‌:

  • 缓存预热:商品服务Bean初始化时,从数据库加载热门商品到Redis。
  • 连接池就绪:数据库连接池Bean在初始化阶段创建10个初始连接。

6. BeanPostProcessor后置处理:最终“包装”‌

触发时机‌:初始化完成后,Bean投入使用前。
核心动作‌:

  • Spring遍历所有BeanPostProcessor,执行postProcessAfterInitialization()方法。
  • 生成代理对象‌:例如,为@Transactional标注的Service类生成AOP代理,实现事务管理。
  • 功能增强‌:例如,为Bean添加性能监控、熔断降级逻辑。

典型场景‌:

  • AOP代理‌:普通的UserService对象被包装为代理对象,方法调用前后自动记录日志。
  • 缓存拦截‌:在代理对象中,为查询方法添加缓存逻辑(如先查Redis,再查数据库)。

7. 运行阶段:Bean正式“上岗”‌

触发时机‌:后置处理完成后,Bean放入Spring容器。
核心动作‌:

  • 通过applicationContext.getBean()获取Bean,或被其他Bean依赖注入。
  • Bean执行业务逻辑,如Controller调用Service,Service调用DAO。

典型场景‌:

  • 用户请求到达Controller,调用UserService的createUser()方法。
  • 微服务中,Feign客户端Bean发起HTTP调用其他服务。

8. 销毁阶段:Bean的“善后工作”‌

触发时机‌:Spring容器关闭时(如调用context.close())。
核心动作‌(按顺序执行):

  • @PreDestroy注解方法‌:标记在Bean的某个方法上,Spring自动调用。例如:关闭网络连接、释放文件句柄。
  • DisposableBean接口的destroy()‌:接口定义的销毁方法,Spring自动调用。例如:数据库连接池关闭所有连接。
  • 自定义destroy-method‌:通过XML或@Bean(destroyMethod=“close”)指定的销毁方法。例如:停止定时任务、清理临时文件。

典型场景‌:

  • 连接池Bean销毁时,释放所有数据库连接。
  • 消息队列监听器Bean销毁时,关闭消费者线程。

现实世界类比‌

实例化‌ → 工厂生产一台手机(硬件组装)。
属性注入‌ → 安装操作系统和预装软件(赋予基础功能)。
Aware回调‌ → 手机连接Wi-Fi,获取网络权限(感知外部环境)。
BeanPostProcessor前置处理‌ → 质检员检查硬件是否合格。
初始化‌ → 用户首次开机,完成系统设置(激活功能)。
BeanPostProcessor后置处理‌ → 安装保护壳和贴膜(增强防护)。
运行阶段‌ → 用户正常使用手机。
销毁阶段‌ → 手机关机,释放电量(清理资源)。

小白生命周期记忆口诀‌:“先造空壳,再装零件,认识环境,质检过关,开机初始化,包装上市,干活,最后退休”。

CSDN

📥博主的人生感悟和目标

Java程序员廖志伟

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: Java程序员廖志伟
  • 👉 开源项目:Java程序员廖志伟
  • 🌥 哔哩哔哩:Java程序员廖志伟
  • 🎏 个人社区:Java程序员廖志伟
  • 🔖 个人微信号SeniorRD
    Java程序员廖志伟

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 `git pull --rebase` 与 `--allow-unrelated-histories`:区别、原理与实战指南

🚀 git pull --rebase vs --allow-unrelated-histories 全面解析 在日常使用 Git 时,我们经常遇到两种拉取远程代码的方式:git pull --rebase 和 git pull --allow-unrelated-histories。它们的区别是什么?各自适用哪些场景&…

Matlab_Simulink中导入CSV数据与仿真实现方法

前言 在Simulink仿真中,常需将外部数据(如CSV文件或MATLAB工作空间变量)作为输入信号驱动模型。本文介绍如何高效导入CSV数据至MATLAB工作空间,并通过From Workspace模块实现数据到Simulink的精确传输,适用于运动控制…

Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点

以下是 Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点: 一、JdbcTemplate 处理枚举类型转换 1. 场景说明 假设数据库存储的是枚举的 String 或 int 值,但 Java 实体类使用 enu…

API 安全之认证鉴权

作者:半天 前言 API 作为企业的重要数字资源,在给企业带来巨大便利的同时也带来了新的安全问题,一旦被攻击可能导致数据泄漏重大安全问题,从而给企业的业务发展带来极大的安全风险。正是在这样的背景下,OpenAPI 规范…

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表,该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all(尽量不要删),使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer;找不到合适颜色…

Oracle 数据库系统全面详解

Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS),由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件: 存储层次: 2. …

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种: 批量计算(batch computing) MapReduce Hive Spark Flink pig流式计算(stream computing) Storm SparkStreaming/StructuredStreaming Flink Samza交互计…

在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程

前言 首先回顾下前面文章介绍的: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流…

Go红队开发— 收官工具

文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 💡 本博客绝不涉及任何非法用途。 💡 使用者风险自担,违规后果自负。 💡 守法为先,技术向善。 …

论文阅读《P​roximal Curriculum for Reinforcement Learning Agents》——提升智能体学习速度的

老规矩,今天是使用Gemini2.5pro来生成的模板 这篇论文研究了如何为处理多个相关任务的强化学习智能体自动设计学习课程(即任务顺序),以加速训练过程,并解决现有方法需要大量调参或缺乏理论依据的问题。为此&#xff0…

【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特点:简单、直观,现代浏览器支持良好。 代码: css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

基于SpringBoot的失物招领平台(源码+数据库)

476基于SpringBoot的失物招领平台,有用户和管理员两个角色,主要功能如下 失物招领系统功能介绍如下: 1. 用户功能: - 发布失物公告:用户可以发布自己的失物信息 - 失物分类:用户可以根据失物的类型进行分类…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置: 步骤: step one 安装包 step two 获取股票代码 step three 敲代码,实现 step four 网址转pdf网址 视频 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本节讲…

量子退火与机器学习(2):少量实验即可找到新材料,黑盒优化➕量子退火

使用量子退火和因子分解机设计新材料 这篇文章是东京大学的一位博士生的毕业论文中的主要贡献。 结合了黑盒优化和量子退火,是融合的非常好的一篇文章,在此分享给大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…

从零开始:Makefile 与 CMake 的基础入门与实践

本文适合基础学者 零基础 makefile 定义:Makefile 是一种传统的构建工具,用于定义如何编译和链接源代码。它通过一系列规则来描述如何生成目标文件(如可执行文件或库)。 功能:定义编译规则(如如何从源文件…

android开启Sys V IPC,并使用共享内存编程

参考:安卓开启Sys V IPC,并使用共享内存编程 | 久奈浜的CS部 删除config中-# CONFIG_SYSVIPC is not set 在rk3576.config中增加CONFIG_SYSVIPCy CONFIG_SYSVIPCy CONFIG_SYSVIPC_SYSCTLy CONFIG_SYSVIPC_COMPATy CONFIG_IPC_NSy system/sepolicy/pre…

docker pull lss233/one-api:latest 在哪里运行,作用是什么

docker pull lss233/one-api:latest 在哪里运行,作用是什么 1. 在哪里运行? docker pull lss233/one-api:latest 是一个Docker命令,需在已安装Docker的环境中执行。 适用环境:本地开发机、服务器、云主机等。前提条件:需先安装Docker并配置好环境。2. 作用是什么? 该命令…

轮胎厂相关笔记

一、术语 图解:https://news.yiche.com/hao/wenzhang/38498703/ 1、胚胎 在轮胎制造行业中,“胎胚”(也称“生胎”或“未硫化轮胎”)是指轮胎在硫化(高温高压固化)之前的半成品形态。它是轮胎成型的中间…

开发者视角:应用程序中HTTP代理的集成指南

目录 一、为何需要HTTP代理? 二、集成方式分阶解析 三、关键配置管理策略 四、安全与性能平衡 五、调试与问题排查 六、最佳实践总结 结语 在开发需要与外部网络交互的应用程序时,HTTP代理是绕不开的实用工具。它既能解决网络限制问题&#xff0c…

从纸质到 AI 时代:我的笔记工具探索之旅

今天清晨,在得到上闲逛时,偶然间发现了一本名为《笔记的方法》的书,这本由Flomo的作者出版的图书,深入探讨了记笔记的艺术。 说起记笔记,这些年来,我尝试了各种各样的工具,今天就来梳理一下我的…