SSM框架——Day4

Bean的生命周期

Bean的生命周期指的是从创建到销毁的整个过程,通常由Spring IoC容器管理。以下是Bean生命周期的关键阶段:

实例化:容器通过构造器或工厂方法创建Bean的实例。此时对象尚未初始化,属性未注入。
属性赋值:

容器根据配置(如XML、注解)为Bean注入依赖项,包括基本类型、集合、引用其他Bean等。

初始化前处理

若Bean实现接口,容器会调用对应方法(如setBeanName())传递相关信息。

自定义初始化

调用InitializingBean接口的afterPropertiesSet()方法,或执行通过@PostConstruct注解或XML配置的init-method指定的方法。

Bean可用

完成初始化后,Bean进入可用状态,可被其他对象依赖或通过容器获取。

销毁前处理

容器关闭时,若Bean实现DisposableBean接口,会调用destroy()方法,或执行通过@PreDestroy注解或XML配置的destroy-method指定的方法。

生命周期扩展点

开发者可通过以下方式干预生命周期:

  • Aware接口 :如ApplicationContextAware可获取Spring上下文。
  • BeanPostProcessor:在初始化前后插入自定义逻辑,适用于所有Bean。
  • InstantiationAwareBeanPostProcessor:在实例化前后介入,影响Bean创建。

ctx.registerShutdownHook() 和 ctx.close() 的区别

在 Spring 应用生命周期管理中,registerShutdownHook()close() 都是用于关闭应用上下文的方法,但它们的触发时机和用途存在差异。

registerShutdownHook()
  • 注册一个 JVM 关闭钩子(Shutdown Hook),在 JVM 即将关闭时自动调用 close() 方法清理资源。
  • 适用于需要优雅关闭的场景(如释放数据库连接、停止后台线程等)。
  • 通常在主程序启动时调用,确保应用退出时触发清理逻辑。
close()
  • 直接手动关闭应用上下文,立即释放资源。
  • 适用于需要显式控制关闭时机的场景(如测试用例结束后)。
  • 调用后上下文无法再次使用,需重新创建。

registerShutdownHook()位置可以换,放在哪儿都优雅的执行,close()放在前面会即刻关闭,后面其他内容不再执行,但是会执行destory()。

关键差异
  1. 触发方式

    • registerShutdownHook() 依赖 JVM 关闭信号(如 Ctrl+Ckill 命令)。
    • close() 需显式调用,不依赖外部事件。
  2. 执行时机

    • Shutdown Hook 在 JVM 退出前异步执行。
    • close() 同步执行且立即生效。
  3. 典型用途

    • 生产环境推荐使用 registerShutdownHook() 确保资源清理。
    • 测试或脚本中可手动调用 close() 精确控制生命周期。
注意事项
  • 两者均会触发 @PreDestroy 方法和 DisposableBean 接口的实现。
  • 避免重复调用 close(),可能导致异常。
  • Spring Boot 的 SpringApplication 默认会注册 Shutdown Hook,无需手动调用。
相关推荐
yanqiaofanhua36 分钟前
C语言自学--数据在内存中的存储
c语言·开发语言
计算机软件程序设计4 小时前
基于Python的二手车价格数据分析与预测系统的设计与实现
开发语言·python·数据分析·预测系统
微笑尅乐4 小时前
力扣350.两个数组的交集II
java·算法·leetcode·动态规划
rzjslSe4 小时前
【JavaGuide学习笔记】理解并发(Concurrency)与并行(Parallelism)的区别
java·笔记·学习
青柠编程5 小时前
基于Spring Boot的竞赛管理系统架构设计
java·spring boot·后端
꒰ঌ 安卓开发໒꒱5 小时前
Java面试-并发面试(二)
java·开发语言·面试
Mr.Aholic5 小时前
Java系列知识之 ~ Spring 与 Spring Boot 常用注解对比说明
java·spring boot·spring
比特森林探险记5 小时前
Golang面试-Channel
服务器·开发语言·golang
xiangzhihong86 小时前
Spring Boot实现文字转语音功能
开发语言·python
月夕·花晨6 小时前
Gateway-断言
java·开发语言·分布式·spring cloud·微服务·nacos·sentinel