@PostConstruct 和 @PreDestroy 的坑

JDK版本与Spring注解
作者在使用JDK 10学习Spring框架时遇到@PostConstruct和@PreDestroy两个注解方法未被执行的问题。经过排查发现是由于JDK版本不兼容导致,更换为JDK 1.8后问题解决。

本人用的jdk10 学习spring时,发现@PostConstruct 和 @PreDestroy两个注解注释的方法不执行,后上网查找发现是JDK版本问题,切换到jdk1.8后即可。

### @PostConstruct @PreDestroy 注解的用法及区别 #### 一、@PostConstruct 的功能与使用场景 `@PostConstruct` 是 Java 提供的一个标准注解,通常被用来定义 Bean 初始化完成后的回调方法。当 Spring 容器创建了一个 Bean 并完成了依赖注入之后,会自动调用标记有 `@PostConstruct` 的方法[^1]。 此注解的主要用途是在对象实例化并装配完成后执行一些额外的操作,比如资源加载、配置初始化或者状态校验等操作。需要注意的是,该方法必须是非静态的,并且不能带有任何参数[^2]。 ```java import javax.annotation.PostConstruct; public class ExampleService { private String message; public ExampleService(String message) { this.message = message; } @PostConstruct public void init() { System.out.println("Initializing bean with message: " + message); } } ``` #### 二、@PreDestroy 的功能与使用场景 相对应于 `@PostConstruct`,`@PreDestroy` 则是用来标注在 Bean 销毁前需要执行的方法上。它允许开发者清理资源或保存数据到持久存储中,确保程序退出时不会留下未处理的任务或泄露资源。 同样地,这个方法也应该是无参形式,并且由容器负责在其生命周期结束之前触发调用。 ```java import javax.annotation.PreDestroy; public class CleanupService { @PreDestroy public void cleanup() { System.out.println("Cleaning up resources..."); } } ``` #### 三、两者之间的主要差异 - **执行时机**:`@PostConstruct` 方法会在构造函数执行完毕以及属性设置好以后立即运行;而 `@PreDestroy` 方法则是在 Bean 被移除出 IoC 容器之前的瞬间被执行。 - **适用范围**:虽然它们都可以应用于任意类中的公共/受保护/私有的非静态方法之上,但是只有那些被声明为 Spring 管理下的 Beans 才能真正享受到这两个注解带来的便利效果。 #### 四、Spring 实现机制探讨 对于如何支持上述两个 JSR-250 规范内的注解,Spring内部通过 CommonAnnotationBeanPostProcessor 来识别处理这些特殊的 Lifecycle Callbacks 。这意味着如果希望项目能够正常使用此类特性,则需确保已注册相应的处理器组件至上下文中。 ```xml <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值