注解名稱 | 模塊 | 功能 | 引入年份 | 版本 | 是否推薦使用 |
---|---|---|---|---|---|
@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 典型用法