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,无需手动调用。
相关推荐
lly2024069 小时前
C# 变量作用域
开发语言
魔力军9 小时前
Rust学习Day3: 3个小demo实现
java·学习·rust
时艰.9 小时前
java性能调优 — 高并发缓存一致性
java·开发语言·缓存
落花流水 丶9 小时前
Java 多线程完全指南
java
MSTcheng.9 小时前
【C++】C++智能指针
开发语言·c++·智能指针
无小道9 小时前
Qt——网络编程
开发语言·qt
wazmlp0018873699 小时前
第五次python作业
服务器·开发语言·python
云深处@9 小时前
【C++11】部分特性
开发语言·c++
尘缘浮梦9 小时前
websockets简单例子1
开发语言·python
jxy99989 小时前
mac mini 安装java JDK 17
java·开发语言·macos