我们来说一下 bean 的生命周期

简介: 我是小假 期待与你的下一次相遇 ~


为了更直观地理解,我们可以将整个生命周期分为几个大的阶段,下图清晰地展示了这一过程:

image.gif 编辑

Bean 生命周期的详细步骤

第一阶段:Bean 的元数据配置与容器启动

  1. 配置元数据:首先,你需要通过 XML、Java 注解(如 @Component, @Service, @Autowired)或 Java 配置类(@Configuration, @Bean)来定义 Bean。
  2. 容器启动:Spring 容器(如 ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的 BeanDefinition 对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。

第二阶段:Bean 的实例化与初始化(核心生命周期)

1. 实例化(Instantiation)

  • 描述:容器首先会调用 Bean 的构造函数(或工厂方法)来创建一个新的实例。此时只是一个简单的 Java 对象,还没有进行依赖注入,我们可以把它比作“新生儿”。
  • 扩展点:无直接扩展点。

2. 依赖注入(Populate Properties)

  • 描述:Spring 根据配置(如 @Autowired, @Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的“血肉”。
  • 扩展点:无直接扩展点。

3. Aware 接口回调(Aware Interface Injection)

  • 描述:如果 Bean 实现了各种 Aware 接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如 BeanNameAware, BeanFactoryAware, ApplicationContextAware)注入到 Bean 中。
  • 扩展点
  • BeanNameAware:设置 Bean 的 ID/Name。
  • BeanFactoryAware:设置当前的 BeanFactory
  • ApplicationContextAware:设置当前的 ApplicationContext(功能最全)。
  • EnvironmentAware:设置 Environment 对象(用于获取配置文件属性)等。

4. BeanPostProcessor 前置处理

  • 描述:这是极其重要的扩展点。所有实现了 BeanPostProcessor 接口的 Bean,它们的 postProcessBeforeInitialization 方法会在这个阶段被调用。它可以对 Bean 进行包装或增强,返回一个可能是代理对象的 Bean。
  • 扩展点BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)

5. 初始化(Initialization)

  • 描述:Bean 的“成人礼”。在这个阶段,Bean 的初始化逻辑会被执行。
  • a. InitializingBean 接口:如果 Bean 实现了 InitializingBean 接口,会调用其 afterPropertiesSet() 方法。
  • b. 自定义初始化方法:调用通过 @Bean(initMethod = "...") 或 XML 中 init-method 属性指定的自定义初始化方法。
  • 扩展点
  • InitializingBean.afterPropertiesSet()
  • 自定义 init-method

6. BeanPostProcessor 后置处理

  • 描述:这是另一个极其重要的扩展点。所有 BeanPostProcessorpostProcessAfterInitialization 方法会被调用。Spring AOP 就是基于此实现的。如果一个 Bean 需要被代理,通常在这里返回一个代理对象来包装目标 Bean。
  • 扩展点BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)

7. Bean 就绪(Ready)

  • 描述:经过以上所有步骤,Bean 已经完全创建、初始化并可能被代理。它被存放在 Spring 容器(单例池)中,可以被应用程序正常获取和使用了。

第三阶段:Bean 的使用与销毁

8. 使用期

  • 描述:在应用程序运行期间,Bean 被其他组件依赖和调用,执行业务逻辑。

9. 销毁(Destruction)

  • 描述:当 Spring 容器(通常是 ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。
  • a. DisposableBean 接口:如果 Bean 实现了 DisposableBean 接口,会调用其 destroy() 方法。
  • b. 自定义销毁方法:调用通过 @Bean(destroyMethod = "...") 或 XML 中 destroy-method 属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。
  • 扩展点
  • DisposableBean.destroy()
  • 自定义 destroy-method

特殊情况的处理

  • 作用域(Scope):上述生命周期主要针对单例(Singleton) Bean。对于原型(Prototype) 作用域的 Bean,Spring 容器只负责到第 6 步(初始化完成),之后就将 Bean 交给客户端,不再管理其生命周期,因此不会调用销毁方法。
  • 延迟初始化(Lazy):标记为 @Lazy 的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。

总结与记忆技巧

可以把这个过程想象成一个人的一生:

  • 实例化:出生
  • 依赖注入:接受教育,获取生存技能(依赖)
  • Aware 接口:获得身份ID、认识家庭和社会(容器环境)
  • BeanPostProcessor(前):步入社会前的指导
  • 初始化:举行成人礼,开始独立承担责任
  • BeanPostProcessor(后):步入社会后的包装/历练(可能被“代理”)
  • 就绪:成为社会栋梁,贡献力量
  • 销毁:退休,安享晚年,处理身后事


相关文章
|
18天前
|
Cloud Native Java API
Spring Boot 3.0 vs. 2.0
Spring Boot 3.0 带来革命性升级:全面支持 Java 17+ 与 Jakarta EE,引入原生编译、增强可观测性,推动云原生转型。相比 2.0,性能更强、启动更快、更现代。新项目应首选 3.0,老项目需逐步迁移,拥抱未来。
|
17天前
|
设计模式 Java 数据库连接
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)
|
17天前
|
Java 关系型数据库 MySQL
基于springboot的智慧家园物业管理系统
智汇家园管理系统基于Java与Spring Boot开发,结合MySQL数据库,采用B/S架构,实现社区信息化管理。系统涵盖业主信息、报修、缴费等功能,提升物业管理效率与居民服务体验,推动社区管理智能化、透明化发展。
|
17天前
|
Java Spring
IDEA调出services窗口
本教程分两步指导:首先点击指定选项,然后在Templates中添加Spring Boot并应用,即可调出services窗口,快速完成配置。
73 11
|
16天前
|
NoSQL Java API
Redisson 分布式锁深度解析:API 使用与底层源码探秘
本文深入解析Redisson分布式锁的使用与源码实现,涵盖可重入锁、公平锁、读写锁、红锁等核心API的应用场景与配置方法,并通过Lua脚本、Hash结构和看门狗机制剖析其原子性、重入性与自动续期原理,助力开发者高效安全地实现分布式并发控制。
113 0
|
22天前
|
开发框架 Java 测试技术
领域驱动设计(DDD)在中小型项目中的落地实践
本文探讨领域驱动设计(DDD)在中小型项目中的落地实践,涵盖核心概念如领域模型、聚合、限界上下文与事件驱动架构,并结合电商订单系统案例,展示分层架构、仓储模式与领域服务的实际应用,助力团队构建高内聚、易维护的业务系统。
340 10
|
10天前
|
XML 安全 Java
有了解过 SpringBoot 的参数配置吗?
我是小假 期待与你的下一次相遇 ~
|
19天前
|
XML Java 开发者
springboot自动装配的基本原理
Spring Boot自动装配基于“约定大于配置”理念,通过@SpringBootApplication、@EnableAutoConfiguration与spring.factories机制,结合条件注解实现智能Bean加载。它根据依赖自动配置组件,大幅简化开发。其核心是AutoConfigurationImportSelector筛选符合条件的配置类,实现按需装配。开发者可专注业务,享受“开箱即用”的便捷体验。(238字)
|
17天前
|
架构师 微服务
【架构师】微服务的拆分有哪些原则?
微服务拆分需遵循七大原则:职责单一、围绕业务、中台化公共模块、按系统保障级别分离、技术栈解耦、避免循环依赖,并遵循康威定律使架构与组织匹配,提升可维护性与协作效率。
100 4
|
18天前
|
JSON 安全 JavaScript
深入浅出解析 HTTPS 原理
HTTPS是HTTP与SSL/TLS结合的安全协议,通过数字证书验证身份,利用非对称加密安全交换会话密钥,再以对称加密高效传输数据,确保通信的机密性、完整性和真实性。整个过程如同建立一条加密隧道,保障网络交互安全。
481 16