@Scheduled, @PostConstruct, @PreDestroy, @Async, @OnApplicationEvent

注解名称模块功能引入年份版本是否推荐使用
@PostConstructjavax.annotation (Java EE) / spring-beansBean 初始化完成后执行的方法2006Java EE 5 / Spring 2.0✔️ 推荐
@PreDestroyjavax.annotation (Java EE) / spring-beansBean 销毁前执行的方法2006Java EE 5 / Spring 2.0✔️ 推荐
@Asyncspring-context标记方法为异步调用2009Spring 3.0✔️ 推荐
@Scheduledspring-context声明定时任务方法2009Spring 3.0✔️ 推荐
@OnApplicationEventspring-context监听 Spring 应用上下文事件2015Spring 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 典型用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87219.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序请求加载提示防闪烁机制详解

目录 一、问题背景&#xff1a;闪烁现象的产生 二、完整解决方案代码 三、核心防闪烁机制解析 1. 请求计数器&#xff08;requestCount&#xff09; 2. 延迟隐藏定时器&#xff08;关键创新&#xff09; 3. 100ms缓冲期的重要意义 四、关键场景对比分析 场景1&#xff…

linux防火墙讲解

目录 安全管理 一、SELinux安全上下文 1、SELinux 简介 2、基础操作命令 1. 查看SELinux状态 2. 切换工作模式* 3、安全上下文&#xff08;Security Context&#xff09; 1. 查看上下文* 2. 修改上下文 chcon命令 semanage 命令 4、SELinux布尔值&#xff08;Boole…

巧用 Python:将 A3 作业 PDF 轻松转为 A4 可打印格式

在孩子的学习过程中&#xff0c;我们常常会遇到这样的困扰&#xff1a;学校老师发的作业是以 A3 格式的 PDF 文件呈现的&#xff0c;然而家里的打印机却只支持 A4 打印。这时候&#xff0c;要是能有一个简单的方法把 A3 的 PDF 转换为 A4 可打印的格式就好了。别担心&#xff0…

Transformer 核心概念转化为夏日生活类比

以下是把 Transformer 核心概念转化为「夏日生活类比」&#xff0c;不用看代码也能秒懂&#xff0c;搭配冰镇西瓜式记忆法&#xff1a; 一、Transformer 夏日冷饮制作流水线 编码器&#xff08;Encoder&#xff09;&#xff1a;相当于「食材处理间」 把输入&#xff08;比如…

【Linux基础知识系列】第二十九篇-基本的网络命令(ping, traceroute, netstat)

在Linux系统中&#xff0c;网络诊断是系统管理员和用户日常工作中不可或缺的一部分。无论是排查网络连接问题、检查网络延迟&#xff0c;还是监控网络状态&#xff0c;掌握一些基本的网络命令至关重要。本文将详细介绍ping、traceroute和netstat这三种常用的网络命令&#xff0…

javaee初阶-多线程

1.什么是线程 1.1 进程 要了解线程我们首先需要了解什么是进程&#xff1f; 运行的程序在操作系统中以进程的方式运行&#xff0c;比如说电脑打开不同的软件&#xff0c;软件就是不同的进程 1.1.1进程的组织方式 通过双向链表 创建进程就是在双向链表上添加PCB 销毁一个进…

N数据分析pandas基础.py

前言&#xff1a;在数据分析领域&#xff0c;Python 的 Pandas 库堪称得力助手。它不仅拥有高效的数据处理能力&#xff0c;还能与 NumPy 完美配合——后者强大的数值计算功能为 Pandas 提供了坚实的技术基础。 目录 Pandas数据分析实战&#xff1a;解锁数据处理的高效之道 数…

卫星通信链路预算之二:带宽和功带平衡

在上一个章节卫星通信链路预算之一&#xff1a;信噪比分配 中&#xff0c;我们介绍了卫星通信链路中最核心的概念&#xff1a;信噪比分配&#xff0c;并给出了卫星通信链路总信噪比的计算公式。 本篇文章&#xff0c;我们将介绍卫星通信链路中的另外一个基本概念&#xff1a;带…

QGIS新手教程5:图层属性查询与表达式筛选技巧

✅ QGIS新手教程5&#xff1a;图层属性查询与表达式筛选技巧 字段筛选、表达式构建器、选择集操作一步到位&#xff01; 目录 ✅ QGIS新手教程5&#xff1a;图层属性查询与表达式筛选技巧&#x1f4c1; 一、示例数据准备&#xff08;继续使用第四篇中的示例&#xff09;&#…

用 el-dialog 做出弹出框是图片

今天项目上用到个功能是点击按钮弹出一个 modal&#xff0c;有遮罩层而且在上面显示图片。 其实就是 el-dialog 的功能&#xff0c;但是 el-dialog 弹出后&#xff0c;有标签关闭按钮还有背景。 解决办法&#xff1a;el-dialog 的 width 设为 0 就可以了。 <template>…

Gartner《Decision Point for Selecting the Right APIMediation Technology》学习心得

一、API 中介技术概述 背景&#xff0c;API 中介技术变得多样化&#xff0c;应用与集成架构师需要借助决策框架&#xff0c;从企业级 API 网关、轻量级网关、入口网关以及服务网格中挑选出适合多粒度服务和 API 的中介技术。 随着无服务器架构与容器管理系统的兴起&#xff0…

快速 SystemC 之旅(一)

快速 SystemC 之旅&#xff08;一&#xff09; 一、前言背景二、实验环境1. 安装步骤2. 验证安装 三、RTL 级硬件描述1. 初看模块2. 二输入与非门 一、前言背景 因项目需求&#xff0c;近期开始开展电子系统级设计&#xff08;ESL&#xff09;进行事务级建模&#xff08;TLM&a…

解决 Golang 下载golang.org/x包失败方案

在 Golang 开发过程中&#xff0c;不少开发者都遇到过这样的困扰&#xff1a;当试图下载golang.org相关包时&#xff0c;会出现访问失败的情况&#xff0c;尤其是golang.org/x系列包&#xff0c;作为众多第三方库依赖的核心组件&#xff0c;其无法正常下载会严重影响项目的开发…

CppCon 2016 学习:BUILDING A MODERN C++ FORGE FOR COMPUTE AND GRAPHICS

你提供的这段文字是关于 设计一个精简但足够的 C 框架来驱动 Vulkan 的目标陈述&#xff0c;属于项目文档或演讲的第一部分 “Goals”。我们可以把它逐项拆解并深入理解&#xff1a; PART (I – I): GOALS&#xff08;目标&#xff09; 总体目标&#xff1a; 构建一个最小但足…

# AI武装大脑:技术管理者如何用人工智能重构认知与决策系统

作为一位经历了15年技术管理实战的老兵&#xff0c;我见过太多项目因为决策失误、认知局限而陷入泥潭。直到我开始系统性地用AI武装大脑&#xff0c;才真正找到了突破技术管理瓶颈的利器。今天&#xff0c;我要分享的不是那些泛泛而谈的AI概念&#xff0c;而是如何用AI真正提升…

【Linux】UDP与TCP协议

目录 UDP协议 1.1通信流程 1.2函数 socket bind sendto recvfrom close 1.3实现udp通信 TCP协议 1.1TCP头部结构 1.2通信流程 三次握手 正式通信 四次挥手 1.3协议特性 面向字节流 可靠传输 序列号和确认号 重传机制 流量控制和拥塞控制 1.4常用函数 s…

gbase8s之MyBatis批量update问题

源代码 <update id"updateDynamicTableData"><foreach collection"mapList" item"map" separator";">UPDATE ${tableName} SET<foreach collection"map" item"value" index"key" separ…

博图SCL中WHILE语句的使用详解及案例

在西门子TIA Portal的SCL&#xff08;结构化控制语言&#xff09;编程中&#xff0c;WHILE循环是处理条件迭代任务的核心工具。它根据布尔表达式动态控制循环执行&#xff0c;适用于不确定循环次数的场景。下面从语法、执行流程、注意事项到实际案例全面解析。 一、WHILE循环基…

简单聊聊JVM中的几种垃圾收集算法

3.4、分代收集算法 分代收集算法&#xff0c;可以看成以上内容的延伸。它的实现思路是根据对象的生命周期的不同&#xff0c;将内存划分为几块&#xff0c;比如把堆空间划分为新生代和老年代&#xff0c;然后根据各块的特点采用最适当的收集算法。 在新生代中&#xff0c;存在…

依赖已导入,已下载,无法使用问题

明明已经导入依赖&#xff0c;却无法使用相关注解 于是&#xff0c;我使用 mvn dependency:tree -Dverbose 来查看是否有依赖冲突 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project agileboot…