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

Spring-Bean的生命周期

一、什么是Bean生命周期?

Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期,包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点,允许开发者在各阶段插入自定义逻辑。


二、Bean生命周期全流程(附流程图)
开始│├─ 1. Bean定义注册│├─ 2. 实例化(构造函数)│├─ 3. 属性注入(DI)│├─ 4. 初始化阶段│   ├─ 4.1 BeanNameAware等Aware接口│   ├─ 4.2 BeanPostProcessor前置处理│   ├─ 4.3 @PostConstruct注解│   ├─ 4.4 InitializingBean接口│   └─ 4.5 init-method指定方法│├─ 5. 使用阶段(业务逻辑)│└─ 6. 销毁阶段├─ 6.1 @PreDestroy注解├─ 6.2 DisposableBean接口└─ 6.3 destroy-method指定方法
结束

三、核心阶段详解(含代码示例)
1. Bean定义注册
<!-- XML配置示例 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" init-method="init" destroy-method="close"/>
// Java配置示例
@Bean(initMethod = "init", destroyMethod = "close")
public DataSource dataSource() {return new HikariDataSource();
}
2. 实例化阶段
  • 通过反射调用构造函数
  • 注意循环依赖问题(三级缓存机制)
3. 属性注入(DI)
  • @Autowired注解字段注入
  • Setter方法注入
  • 构造函数注入(推荐)
4. 初始化阶段扩展点
public class DatabaseService implements InitializingBean, BeanNameAware {@Autowiredprivate DataSource dataSource;// 1. Aware接口@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware: " + name);}// 2. @PostConstruct@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct执行");}// 3. InitializingBean@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean接口方法执行");}// 4. init-methodpublic void customInit() {System.out.println("自定义init方法执行");}
}
5. 销毁阶段示例
@Component
public class CacheManager implements DisposableBean {@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy执行");}@Overridepublic void destroy() {System.out.println("DisposableBean接口方法执行");}public void clearCache() {System.out.println("自定义destroy方法执行");}
}

四、扩展机制:BeanPostProcessor

实现该接口可对Bean进行全局处理:

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("Before初始化: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("After初始化: " + beanName);return bean;}
}

五、生命周期管理最佳实践
  1. 初始化顺序

    Constructor > @Autowired > @PostConstruct > InitializingBean > init-method
    
  2. 销毁顺序

    @PreDestroy > DisposableBean > destroy-method
    
  3. 应用场景

    • 数据库连接池初始化
    • 缓存预热
    • 资源清理(如文件句柄关闭)
    • 性能监控埋点

六、常见面试考点
  1. BeanFactory和ApplicationContext在Bean初始化时机上的区别
  2. 循环依赖的解决原理
  3. 如何选择不同的初始化方式?
  4. BeanPostProcessor与BeanFactoryPostProcessor区别
  5. 原型(prototype)Bean的生命周期管理

七、总结
  • Bean 生命周期流程图:实例化 -> 2. 依赖注入 -> 3. 初始化 -> 4. 使用 -> 5. 销毁
  • Spring 的生命周期由 Spring 容器管理,从 Bean 的创建到销毁都由容器负责。
  • Spring 提供了很多钩子方法(如 InitializingBean、DisposableBean、@PostConstruct、@PreDestroy)来让你在 Bean 的生命周期内进行干预。

相关文章:

  • 设计模式每日硬核训练 Day 12:装饰器模式(Decorator Pattern)完整讲解与实战应用
  • 2025年RIE SCI2区:三角变异黏菌算法TMSMA,深度解析+性能实测
  • [连载]Transformer架构详解
  • 【Ubuntu | 网络】Vmware虚拟机里的Ubuntu开机后没有网络接口、也没有网络图标
  • Redis 数据类型全解析:从基础到实战应用
  • 【含文档+PPT+源码】基于Python的快递服务管理系统【
  • 沃尔玛墨西哥30分钟极速配送:即时零售战争中的「超导革命」
  • 25N50-ASEMI工业电源专用25N50
  • Spring Batch 专题系列(五):错误处理与重试机制
  • 利用宝塔面板搭建RustDesk服务
  • 边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“
  • Numba 从零基础到实战:解锁 Python 性能新境界
  • 【机器人创新创业成功的三个关键元素及作用?】
  • K8S运维实战之集群证书升级与容器运行时更换全记录
  • leetcode第7题
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——RS485串口测试
  • w290教学资料管理系统
  • Webflux声明式http客户端:Spring6原生HttpExchange实现,彻底摒弃feign
  • 多模态医学AI框架Pathomic Fusion,整合了组织病理学与基因组的特征
  • 【CRF系列】第5篇:CRF的学习:参数估计与优化算法
  • “雷公”起诉人贩子王浩文案开庭:庭审中不承认拐走川川
  • 68岁民营科技企业家、中国环保产业协会原副会长宋七棣逝世
  • 上海车展迎来超百款首发新车,全市多区开展汽车促消费活动
  • 主动权益基金一季度重仓股出炉:腾讯跃升至第一,阿里、比亚迪、中芯国际新进前十
  • 2025年一季度上海市生产总值
  • 瞭望:高校大门要向公众打开,不能让“一关了之”成为常态