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+C 或 kill 命令)。
    • close() 需显式调用,不依赖外部事件。
  2. 执行时机

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

    • 生产环境推荐使用 registerShutdownHook() 确保资源清理。
    • 测试或脚本中可手动调用 close() 精确控制生命周期。
注意事项
  • 两者均会触发 @PreDestroy 方法和 DisposableBean 接口的实现。
  • 避免重复调用 close(),可能导致异常。
  • Spring Boot 的 SpringApplication 默认会注册 Shutdown Hook,无需手动调用。
相关推荐
金銀銅鐵41 分钟前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin44 分钟前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工1 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路1 小时前
go-grpc设计思想
开发语言·后端·golang
catoop1 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x2 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
酷炫码神2 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
驭渊的小故事2 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客3 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1883 小时前
记录本地安装nacos服务的方法及异常
java·开发语言