Spring框架中的 @Async
注解是为了支持异步方法调用而设计的。
异步方法调用是指调用方在发起方法调用后,不需要等待被调用方法的结果返回,而是可以立即继续执行其他任务。这种方式能够提高系统的并发性和响应性,特别适用于一些耗时较长、不需要立即获取结果的操作。
-
-
-
org.springframework.boot -
spring-boot-starter-web -
-
-
-
org.springframework.boot -
spring-boot-starter-aop -
-
-
org.springframework.boot -
spring-boot-starter-task -
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.scheduling.annotation.EnableAsync;
-
- @SpringBootApplication
- @EnableAsync
- public class DemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Service;
-
- @Service
- public class MyService {
- private static final Logger LOGGER = LoggerFactory.getLogger(MyService.class);
-
- @Async
- public void asyncMethod() {
- LOGGER.info("Async method start");
- // 模拟耗时操作
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- LOGGER.info("Async method end");
- }
- }
- 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 {
- @Autowired
- private MyService myService;
-
- @GetMapping("/async")
- public String async() {
- myService.asyncMethod();
- return "Async method called";
- }
- }
当访问 http://localhost:8080/async
时,MyService类中的asyncMethod方法将在独立线程中异步执行,而不会阻塞当前请求线程。在日志中可以看到异步方法的开始和结束输出。
要使@Async注解生效,还需要在配置类中添加@EnableAsync注解,并配置合适的线程池。例如,在Spring Boot中可以通过修改application.properties文件添加以下配置:
- spring.task.execution.pool.core-size=5
- spring.task.execution.pool.max-size=10
- spring.task.execution.pool.queue-capacity=10000
- spring.task.execution.pool.thread-name-prefix=my-async-