大数跨境
0
0

高级开发!Spring Boot自定义@Async注解,底层原理秒懂

高级开发!Spring Boot自定义@Async注解,底层原理秒懂 Spring全家桶实战案例
2025-09-15
0
导读:高级开发!Spring Boot 自定义 @Async异步任务
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!
图片

🎉🎉《Spring Boot实战案例合集》目前已更新172个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:SpringBoot3.4.2



1. 简介

@Async是Spring框架提供的一个注解,用于标记一个方法,使其能够在一个单独的线程中异步执行。这在处理耗时操作(如发送邮件、调用外部API等)时非常有用,可以显著提高应用程序的性能和响应速度

作为一个真正的技术探索者,总是希望能够深入理解每一项技术的底层原理。今天,我们将通过打造一个名为@PackAsync的注解,来亲自实现异步任务功能。这不仅是一次对Spring @Async功能的复刻,更是一次对异步任务执行机制进行深度剖析。

通过本篇文章的学习,你将全面把握异步任务的调度、执行与结果处理。

我们将会应用到如下的技术点:

最终实现的效果如下:

// 开启异步任务@SpringBootApplication@EnablePackAsyncpublic classApp{}// 异步任务@PackAsync(value = "测试异步任务 - 01", executor = "packExecutor")public void task() {}

接下来,我们将详细的一步一步的实现自定义的异步任务。

2. 实战案例

2.1 自定义异步任务注解

@Retention(RUNTIME)@Target({ METHOD })public@interface PackAsync {
  /**任务名称*/  String value() default"" ;  /**任务任务执行的线程池*/  String executor() default"" ;}

说明:

value:用来定义任务的名称,但是在本篇文章中我们将咱不使用。
executor:定义当前异步任务执行的线程池对象beanName。

2.2 定义切面

该切面用来处理具有@PackAsync注解的方法。同时我们还必须考虑一个问题就是当遇到事务时,不能导致事务失效,也就是说要先让异步线程先执行,然后才是事务的切面。

我们的切面不将使用最为常用的@Aspect方式,而是采用Advisor定义切面。这样能更加灵活的控制。

public class PackAsyncAnnotationAdvisor implements PointcutAdvisor{
  private ExecutorService executor ;  private BeanFactory beanFactory ;  public PackAsyncAnnotationAdvisor(ExecutorService executor, BeanFactory beanFactory){    this.executor = executor ;    this.beanFactory = beanFactory ;  }  // 切面的增强逻辑Advice  @Override  public Advice getAdvice(){    return new PackAsyncInterceptor(this.executorthis.beanFactory) ;  }  // 用来匹配切入点的  @Override  public Pointcut getPointcut() {    return new PackAsyncPointcut() ;  }}

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读7
粉丝0
内容832