注解名称 | 模块 | 功能 | 引入年份 | 版本 | 是否推荐使用 |
---|---|---|---|---|---|
@PostConstruct | javax.annotation (Java EE) / spring-beans | Bean 初始化完成后执行的方法 | 2006 | Java EE 5 / Spring 2.0 | ✔️ 推荐 |
@PreDestroy | javax.annotation (Java EE) / spring-beans | Bean 销毁前执行的方法 | 2006 | Java EE 5 / Spring 2.0 | ✔️ 推荐 |
@Async | spring-context | 标记方法为异步调用 | 2009 | Spring 3.0 | ✔️ 推荐 |
@Scheduled | spring-context | 声明定时任务方法 | 2009 | Spring 3.0 | ✔️ 推荐 |
@OnApplicationEvent | spring-context | 监听 Spring 应用上下文事件 | 2015 | Spring 4.2 | ✔️ 推荐(替代 ApplicationListener) |
[Q&A] @PostConstruct,@PreDestroy 引入背景
在 Java EE 5 之前,不同框架和容器(如 EJB、Servlet、Spring 等)都有自己定义的生命周期回调机制,例如:
Servlet 中使用 init() 和 destroy()
Spring 使用 InitializingBean 和 DisposableBean 接口
EJB 使用 @PostConstruct 和 @PreDestroy(EJB 特有)
这导致开发者在不同框架之间切换时需要学习不同的生命周期管理方式,缺乏统一性。
为了解决上述问题,Sun Microsystems(现 Oracle)推动了 JSR-250 规范的制定,旨在为 Java 平台提供一组通用的注解,包括:
@PostConstruct
:初始化方法
@PreDestroy
:销毁前方法
@Resource:资源注入(如数据源、JNDI)
@RolesAllowed、@PermitAll 等安全相关注解
[Q&A] @Async 引入背景
在 Spring 3.0(2009 年)之前,Spring 框架并没有提供原生的注解来支持方法级别的异步调用。开发者通常需要手动创建线程、使用 TaskExecutor 或者集成第三方库(如 java.util.concurrent)来实现异步逻辑。
为了简化异步编程模型,Spring 在 3.0 版本(2009 年)中引入了 @Async 注解,并配合 @EnableAsync 启用异步支持。它基于 Spring 的 AOP 技术,通过代理机制将方法调用提交到线程池中异步执行。
[Q&A] @Scheduled 引入背景
在 @Scheduled 出现之前,Spring 中实现定时任务通常依赖于:
- TimerTask + Timer
- Quartz 框架
- TaskScheduler 手动配置
随着企业应用对定时清理日志、数据同步、健康检查等周期性任务需求的增长,Spring 社区希望提供一个更简洁、集成度更高的方案来满足开发者的需求。因此,在 Spring 3.0 版本中,@Scheduled
注解被正式引入,并配合 @EnableScheduling
注解启用调度功能。
[Q&A] @OnApplicationEvent 引入背景
在 @OnApplicationEvent 出现之前,开发者通常通过以下方式监听 Spring 事件:
// a. 实现 ApplicationListener 接口:
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {// 处理事件逻辑}
}// b. 使用 @EventListener 注解(Spring 4.1 引入):
@Component
public class MyEventListener {@EventListenerpublic void handleMyEvent(MyEvent event) {// 处理事件逻辑}
}
随着微服务和事件驱动架构的普及,Spring 社区希望提供更简洁、语义清晰的方式来监听和处理事件。
因此,在 Spring 4.2 中引入了 @OnApplicationEvent 注解,作为 @EventListener 的补充,专用于监听 ApplicationEvent 及其子类事件。
典型用法
@PostConstruct,@PreDestroy 典型用法
Spring @Async 典型用法
Spring @Scheduled 典型用法
Spring @OnApplicationEvent 典型用法