news 2026/1/11 15:52:18

Spring中Bean的生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring中Bean的生命周期


文章目录

      • 1. **生产(Production)**
        • (1)定义 Bean(Bean Definition)
        • (2)创建 Bean(Bean Instantiation & Initialization)
        • (3)添加 Bean(Add to Container)
      • 2. **使用(Usage)**
      • 3. **销毁(Destruction)**

Spring Bean 生命周期= 生产 → 使用 → 销毁
生产阶段包括:Bean 定义、Bean 创建、Bean 注册
创建 bean包括:创建实例、添加属性、初始化实例、注册销毁

1.生产(Production)

目标:让 Bean 变成容器中一个可用的对象。

(1)定义 Bean(Bean Definition)
  • 含义:在 Spring 容器启动时,通过 XML、注解(如@Component)、Java Config(@Bean)等方式注册 Bean 的元数据
  • 技术体现:生成BeanDefinition对象,存入BeanFactoryBeanDefinitionMap
  • 注意:此时尚未创建实例,只是“蓝图”。

✅ 这一步确实属于“生产”的前置准备。


(2)创建 Bean(Bean Instantiation & Initialization)

这是核心阶段,Spring 内部称为“bean creation”,包括:

  • 创建实例(Instantiation)
    → 调用构造函数 / 工厂方法,生成原始对象。
  • 属性填充(Populate Properties)
    → 注入依赖(如@Autowired字段)。
  • 初始化(Initialization)
    → 执行@PostConstructInitializingBean.afterPropertiesSet()init-method等。
  • 注册销毁回调(Register Destruction Callback)
    → 如果是单例,容器会记录其销毁方法(用于关闭时调用)。

⚠️ 注意:“注册销毁”不是“执行销毁”,而是提前登记,属于“生产”阶段的收尾工作。


(3)添加 Bean(Add to Container)
  • 实际上,一旦 Bean 创建并初始化完成,Spring 就会将其放入单例池(singletonObjects)中(针对 singleton 作用域)。
  • 此后其他 Bean 就可以从容器中获取它。
  • 所以“添加”可理解为“将初始化完成的 Bean 缓存到容器中,供后续使用”

2.使用(Usage)

  • 应用代码通过@AutowiredgetBean()等方式获取并使用 Bean
  • 对于 singleton Bean,所有使用者共享同一个实例。
  • 对于 prototype Bean,每次获取都会走一遍“创建”流程(但不归还给容器,也不管理销毁)。

3.销毁(Destruction)

  • 仅适用于 singleton Bean(prototype 不由容器销毁)。
  • 当容器关闭(context.close()registerShutdownHook()触发)时:
    • 调用@PreDestroy
    • 调用DisposableBean.destroy()
    • 调用destroy-method
  • 容器内部会遍历disposableBeans集合,依次销毁。

🌟 面试推荐回答模板

Spring Bean 的生命周期可以分为生产、使用和销毁三个阶段。
其中生产阶段包括 Bean 的定义、创建和注册。
创建 Bean 时又会经历实例化、属性注入、初始化,并在初始化完成后注册销毁回调。
随后 Bean 进入使用阶段,被容器管理和依赖。
容器关闭时进入销毁阶段,执行相应的销毁方法。

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

超详细版RISC-V指令格式解析:入门学习必备

深入理解RISC-V指令格式:从零开始的硬核解析你有没有在阅读汇编代码时,对着一条sw x5, 8(x6)发愣过?或者看到反汇编器输出的一串二进制,心里直打鼓:“这玩意儿到底是怎么编码的?”如果你正在学习 RISC-V 架…

作者头像 李华
网站建设 2026/1/4 12:54:50

静态代码扫描:CI/CD流程中加入安全检测环节

静态代码扫描:CI/CD流程中加入安全检测环节 在企业加速拥抱AI的今天,一个看似简单的技术选型——比如部署一个本地化的大语言模型应用——背后往往隐藏着复杂的工程权衡。我们不再只是关心“能不能跑起来”,更关注“是否足够安全”、“能否融…

作者头像 李华
网站建设 2026/1/10 20:12:08

Day 21 常见聚类算法

浙大疏锦行 知识点 1.聚类的指标 2.聚类常见算法:kmeans聚类、dbscan聚类、层次聚类 3.三种算法对应的流程 作业:把心脏病数据进行聚类处理 一.kmeans聚类处理结果: 这里我选择K4,结果如下: 能很明显看出来区分度不足&#xff…

作者头像 李华
网站建设 2026/1/3 2:07:09

全面讲解vivado2020.2 Windows安装注意事项

Vivado 2020.2 Windows安装全避坑指南:从下载到运行的实战经验 最近帮实验室几位同学装Vivado,发现哪怕是最基础的“双击下一步”式安装流程,也藏着不少让人抓狂的坑。尤其是 vivado2020.2 这个版本——它既不是最新的(AMD已推…

作者头像 李华
网站建设 2026/1/7 9:40:40

跨端路由设计:如何统一 RN 与 Web 的页面模型

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…

作者头像 李华
网站建设 2026/1/2 20:48:26

【转载】RTOS中队列、环形队列、优先级队列的实现及使用

1. 什么是队列 队列(queue)是一种只能在一端插入元素、在另一端删除元素的数据结构,遵循「先入先出」(FIFO)的规则。 队列中有两个基本概念: 队头指针(可变):永远指向此队…

作者头像 李华