@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()
方法。
- 当 Spring 容器创建
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()
方法。
- 当 Spring 容器关闭或 Bean 被销毁时,会调用
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
暂无评论内容