当前位置: 首页 > news >正文

spring生命周期

Spring Bean 生命周期

Spring Bean 的生命周期是指 Spring 容器从 Bean 的实例化销毁的完整管理过程。其核心流程围绕 AbstractAutowireCapableBeanFactory.doCreateBean() 方法展开,主要分为以下阶段:

一、实例化(Instantiation)

Spring 容器通过反射机制调用 Bean 的构造器(默认无参构造器或指定构造器)创建原始对象实例。此时 Bean 处于“半成品”状态,所有属性均为默认值。

二、属性赋值(Populate Properties)

容器根据配置(@Autowired@Value@Resource 等注解或 XML 配置)执行依赖注入(DI),将依赖的 Bean 实例和配置值注入到当前 Bean 的对应字段中。此阶段由 populateBean() 方法完成。

三、Aware 接口回调(Aware Interface Callback)

若 Bean 实现了特定的 Aware 接口,容器会回调对应方法注入容器资源,执行顺序固定:

  1. BeanNameAware.setBeanName():注入 Bean 在容器中的名称。
  2. BeanFactoryAware.setBeanFactory():注入 BeanFactory 实例。
  3. ApplicationContextAware.setApplicationContext():注入 ApplicationContext 实例(仅限 ApplicationContext 容器)。

四、BeanPostProcessor 前置处理(Pre-Initialization)

容器调用所有注册的 BeanPostProcessor.postProcessBeforeInitialization() 方法。这是 Spring 提供的全局扩展点,允许在 Bean 初始化前修改 Bean 实例(如属性校验、包装对象)。

五、初始化(Initialization)

Bean 执行开发者定义的初始化逻辑,执行顺序严格固定:

  1. @PostConstruct 注解方法(JSR-250 标准,优先级最高)。
  2. InitializingBean.afterPropertiesSet() 接口方法。
  3. init-method(通过 @Bean(initMethod = "...") 或 XML 配置的自定义初始化方法)。

六、BeanPostProcessor 后置处理(Post-Initialization)

容器调用 BeanPostProcessor.postProcessAfterInitialization() 方法。这是 AOP 代理的生成点——Spring 在此判断 Bean 是否需要被代理(如 @Transactional@Async),若需要则返回 JDK 或 CGLIB 动态代理对象替换原始 Bean。

七、就绪(Ready)

Bean 完全初始化完成,被放入容器的单例池singletonObjects,一级缓存),可供应用程序正常调用。

八、销毁(Destruction)

当容器关闭时(调用 context.close() 或 JVM 优雅退出),触发销毁逻辑,执行顺序与初始化相反:

  1. @PreDestroy 注解方法。
  2. DisposableBean.destroy() 接口方法。
  3. destroy-method(自定义销毁方法)。

关键扩展点速查表

扩展点 阶段 作用
BeanFactoryPostProcessor BeanDefinition 注册后,实例化前 修改 Bean 的定义元数据
BeanPostProcessor.postProcessBeforeInitialization 实例化后,初始化前 统一修改 Bean 实例
@PostConstruct / InitializingBean 初始化阶段 执行自定义初始化逻辑
BeanPostProcessor.postProcessAfterInitialization 初始化后 AOP 代理生成
@PreDestroy / DisposableBean 销毁阶段 释放资源

面试高频追问

Q1:AOP 代理在哪一步生成?
A:在 BeanPostProcessor.postProcessAfterInitialization() 阶段。Spring 通过 AbstractAutoProxyCreator 判断 Bean 是否需要被代理,若需要则返回代理对象。

Q2:@PostConstructInitializingBean 的执行顺序?
A:@PostConstruct 先于 afterPropertiesSet()afterPropertiesSet() 先于 init-method

Q3:单例 Bean 和多例 Bean 的生命周期差异?
A:单例 Bean 由容器管理完整生命周期(创建→初始化→销毁);多例 Bean(prototype)容器只负责创建和初始化,不负责销毁,销毁逻辑需由调用方自行管理。

http://www.jsqmd.com/news/805732/

相关文章:

  • 为什么92%的设计师在Basic计划第3周放弃?——基于1,842份用户行为日志的紧迫预警
  • 2026年四川轻奢入户门权威推荐指南:四川家装入户门/四川小区入户门/四川指纹锁门/四川新房入户门/四川旧房换门/选择指南 - 优质品牌商家
  • 2026金铲铲之战电脑版模拟器实测:选对模拟器轻松上分
  • AI时代工程师的超能力进化
  • 3分钟快速上手:如何用res-downloader高效下载视频号资源
  • 基于 Harmony6.0 的智慧学习应用页面构建实战:从组件封装到跨端 UI 设计
  • day13-C语言-指针
  • 开源OmenSuperHub:解决惠普OMEN笔记本性能限制的完整技术方案
  • 合肥元森倍健:营养榧塑膳食/香榧产地/香榧价值/香榧作用/香榧功效/香榧瘦身产品/天然榧塑膳食/天然膳食/安徽香榧种植园/选择指南 - 优质品牌商家
  • 第八篇:Spring与微服务——从SpringBoot到SpringCloud的演进
  • 专业Word文档自动化生成:从模板引擎到批量处理实战
  • 从Google Glass拆解看硬件设计:芯片选型、成本控制与可穿戴设备挑战
  • 2026年4月射洪优质装饰公司推荐指南:射洪精装修、射洪装饰公司、射洪家装、射洪装饰、射洪整装、射洪装修公司、射洪装修选择指南 - 优质品牌商家
  • 25mm×35mm的照片像素多少怎么调整?照片调尺寸方法
  • 供应链数字化转型:从线性链条到智能网络的演进与实践
  • 网盘直链解析工具完整指南:技术实现与高效下载策略
  • MCP协议实战:构建AI智能体任务管理服务器与二次开发指南
  • 快速排序的递归与非递归实现
  • 开发者必备:命令行优先的备忘录与代码片段管理工具Mnemon
  • 2026年高强级反光膜全攻略:三类反光膜、二类反光膜、五类反光膜、交通标志杆件、人防标牌、反光交通标牌、反光膜加工选择指南 - 优质品牌商家
  • 手把手带你拿下ElevenLabs Creator认证:从环境配置、语音样本提交到模型定制部署的完整流水线(含GitHub可运行脚本)
  • 2026年5月自贡建筑装饰选材指南:为何任鸟飞成为发泡陶瓷雕花口碑之选? - 2026年企业推荐榜
  • ARM MPMC静态内存控制器架构与寄存器配置详解
  • 2026Q2线上百货加盟权威选择:前置仓加盟/投资即使零售平台/投资线上百货超市/投资网上超市/投资网络超市/本低仓加盟/选择指南 - 优质品牌商家
  • 未来已来:AI驱动的数据湖仓
  • 基于OpenTelemetry的Gemini CLI本地数据驾驶舱部署与实战指南
  • 2026现阶段西安防水堵漏公司深度**:远大加固为何成为行业优选? - 2026年企业推荐榜
  • 基于MCP协议的AssistAI:深度集成Eclipse的AI编程助手实战指南
  • 长沙定制开发本地生活APP打造城市便民消费场景
  • 2篇3章3节:Trae 的高效小说创作与文件管理实操