@Async(“asyncTaskExecutor“) 注解介绍
@Async(“asyncTaskExecutor”) 注解用于 Spring 框架中的异步处理功能。它允许你将某个方法标记为异步执行,以便在调用时不阻塞当前线程。下面是如何使用这个注解的详细步骤。
- 添加依赖
首先,确保你的 pom.xml 中包含 Spring Boot Starter Web 和 Spring Boot Starter Async 的依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
</dependencies>
- 启用异步支持
在你的主应用类或配置类中,使用 @EnableAsync 注解启用异步支持:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
- 配置任务执行器
定义一个异步任务执行器。你可以在配置类中自定义它:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
public class AsyncConfig implements AsyncConfigurer {@Bean(name = "asyncTaskExecutor")public Executor asyncTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.initialize();return executor;}
}
- 使用 @Async 注解
在需要异步执行的方法上使用 @Async 注解:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class MyAsyncService {@Async("asyncTaskExecutor")public void executeAsyncTask() {// 模拟耗时任务try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("异步任务完成");}
}
- 调用异步方法
在控制器或其他服务中调用这个异步方法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate MyAsyncService myAsyncService;@GetMapping("/start-async")public String startAsync() {myAsyncService.executeAsyncTask();return "异步任务已启动";}
}
注意事项
异步方法必须是 public 的,并且不能在同一类中调用自己,否则会因为 AOP 的代理机制而失效。
异步方法的返回值类型应该是 void 或 Future<T>,以便处理返回结果。