找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

979

积分

0

好友

111

主题
发表于 前天 10:16 | 查看: 6| 回复: 0

在深入理解Spring框架时,IoC容器的核心——Bean的生命周期管理是必须掌握的概念。整个流程细节繁多,难以完整记忆,但只需抓住几个关键扩展点即可满足大多数开发需求。从宏观视角看,Bean的生命周期如下图所示:

图片

对于应用开发者而言,最主要的是利用Spring提供的两个业务扩展钩子,实现对Bean初始化和销毁过程的定制:

  • 初始化扩展:在Bean属性设置完成后、投入使用前,执行自定义逻辑。
  • 销毁扩展:在Bean被容器销毁之前,执行清理逻辑。

常见的应用场景包括:

  • 初始化数据库连接、网络套接字、文件句柄等资源。
  • 执行启动时的数据加载或缓存预热。
  • 销毁前关闭资源、保存状态或发送通知。

1. 初始化钩子:@PostConstruct

只需在方法上添加 @PostConstruct 注解,该方法便会在Bean的初始化阶段被 Spring容器 自动调用。这是执行启动逻辑最便捷的方式。

@Component
public class CricketCoach implements Coach {

    public CricketCoach() {
        System.out.println("In constructor: " + getClass().getSimpleName());
    }

    @PostConstruct
    public void doMyStartupStuff() {
        System.out.println("In myInit method: " + getClass().getSimpleName());
        // 此处可添加自定义初始化代码,如建立数据源连接
    }
}

重启应用后,控制台将依次打印构造器和初始化方法的日志(请确保移除了之前可能设置的全局懒加载配置)。

2. 销毁钩子:@PreDestroy

同理,在方法上添加 @PreDestroy 注解,该方法会在Bean实例被容器销毁之前调用,适用于资源清理。

@Component
public class CricketCoach implements Coach {

    public CricketCoach() {
        System.out.println("In constructor: " + getClass().getSimpleName());
    }

    @PostConstruct
    public void doMyStartupStuff() {
        System.out.println("In myInit method: " + getClass().getSimpleName());
    }

    @PreDestroy
    public void doMyCleanupStuff() {
        System.out.println("In myDestroy method: " + getClass().getSimpleName());
        // 此处可添加自定义清理代码,如关闭文件流、断开网络连接
    }
}

当正常停止Spring Boot应用时,可以在控制台看到销毁方法的输出日志。

重要提示:关于 Prototype 作用域 Bean 的销毁

对于作用域为 prototype 的Bean,@PostConstruct 注解的初始化方法仍会生效,但 @PreDestroy 注解的销毁方法将不会被调用

这是因为 核心IoC容器prototype Bean的生命周期管理策略不同:容器负责实例化、配置和组装原型Bean,之后将其交给客户端,便不再跟踪和管理该实例的后续生命周期,因此不会触发预定义的销毁回调。这也体现了Spring在Bean生命周期管理上的灵活性。

通过这两个简单的注解,开发者可以轻松介入Spring Bean生命周期的关键节点,实现高效的 资源管理 和业务逻辑的初始化和清理,是构建健壮Java应用的基础技能。




上一篇:B端系统架构与C端用户体验融合实战:从技术指标到业务价值的四步法
下一篇:深入理解Java方法重载机制:从语法定义到面向对象编程的多态实现
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 16:31 , Processed in 0.101608 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表