面试题:Spring 中的 @PostConstruct 和 @PreDestroy 注解的作用是什么?

@PostConstruct 和 PreDestroy 是 Java EE 规范中的注解,Spring 框架也支持它们。它们用于管理 Bean 的生命周期,分别在 Bean 初始化和销毁时执行特定的逻辑。


1. @PostConstruct 的作用

@PostConstruct 注解用于标记一个方法,该方法会在 Bean 初始化完成后立即执行。通常用于执行一些初始化操作,比如加载资源、初始化配置等。

特点

  • 执行时机:在 Bean 的依赖注入完成之后,Bean 正式投入使用之前执行。
  • 只执行一次:每个 Bean 的生命周期中只会执行一次。
  • 替代 InitializingBean 接口:相比于实现 InitializingBean 接口,使用 @PostConstruct 更加简洁。

示例

@Component
public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("Bean 初始化完成,执行初始化逻辑...");
        // 例如:加载配置文件、初始化缓存等
    }

    public void doSomething() {
        System.out.println("执行业务逻辑...");
    }
}
  • 解释
    • 当 Spring 容器创建 MyBean 实例并完成依赖注入后,会调用 init() 方法。

2. @PreDestroy 的作用

@PreDestroy 注解用于标记一个方法,该方法会在 Bean 被销毁之前执行。通常用于执行一些清理操作,比如释放资源、关闭连接等。

特点

  • 执行时机:在 Bean 被销毁之前执行。
  • 只执行一次:每个 Bean 的生命周期中只会执行一次。
  • 替代 DisposableBean 接口:相比于实现 DisposableBean 接口,使用 @PreDestroy 更加简洁。

示例

@Component
public class MyBean {

    @PreDestroy
    public void cleanup() {
        System.out.println("Bean 即将销毁,执行清理逻辑...");
        // 例如:关闭数据库连接、释放资源等
    }

    public void doSomething() {
        System.out.println("执行业务逻辑...");
    }
}
  • 解释
    • 当 Spring 容器关闭或 Bean 被销毁时,会调用 cleanup() 方法。

3. 使用场景

  • @PostConstruct
    • 初始化缓存。
    • 加载配置文件或静态数据。
    • 启动后台线程或定时任务。
  • @PreDestroy
    • 关闭数据库连接或网络连接。
    • 释放文件句柄或其他系统资源。
    • 停止后台线程或定时任务。

4. 完整示例

@Component
public class DatabaseManager {

    @PostConstruct
    public void init() {
        System.out.println("初始化数据库连接...");
        // 模拟初始化数据库连接
    }

    public void queryData() {
        System.out.println("查询数据库...");
    }

    @PreDestroy
    public void close() {
        System.out.println("关闭数据库连接...");
        // 模拟关闭数据库连接
    }
}
  • 测试代码
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        DatabaseManager manager = context.getBean(DatabaseManager.class);
        manager.queryData();
        context.close(); // 关闭容器,触发 @PreDestroy 方法
    }
}
  • 输出
初始化数据库连接...
查询数据库...
关闭数据库连接...

5. 总结

  • @PostConstruct
    • 在 Bean 初始化完成后执行,用于初始化逻辑。
  • @PreDestroy
    • 在 Bean 销毁之前执行,用于清理逻辑。
  • 优点
    • 相比于实现 InitializingBean 和 DisposableBean 接口,使用注解更加简洁和直观。
    • 符合 Java EE 规范,具有更好的可移植性。

这两个注解是 Spring 中管理 Bean 生命周期的常用工具,能够帮助开发者在 Bean 的初始化和销毁阶段执行特定的逻辑。

THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容