Spring Boot 2.x 开始,默认情况下,Spring AOP 使用 CGLIB 代理
@Async不能在同一个类中直接调用
关于在控制器不能使用@Async 并不是因为SpringBoot2以前使用JDK代理
因为JDK代理需要类实现接口,控制器没有实现接口等原因
真正原因是 @Async 不能在同一个类中直接调用。如果一个类中的方法 A 调用标记为 @Async 的方法 B,B 方法不会以异步方式执行,因为它不会通过代理对象 因为 A方法调用B方法时候有个this
this.B() 那还代理个毛
初始化时候检查是否启动了@EnableAsync 如果启动了 检查@Async 如果有该注解 在初始化时候代理对象就生成好了 也就是说代理对象在SpringBoot初始化时候就已经生成了
配置类或者启动类@EnableAsync
如果你给@Bean取了名字 那么使用时候 @Async("xxxxxx")
关于@Async的线程控制 用TaskExecutor
ThreadPoolTaskExecutor 来实际控制 如果有必要想改变的话 可以配置
也可以在配置文件 配置的方式
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=10
spring.task.execution.pool.queue-capacity=500
spring.task.execution.pool.keep-alive=60s
spring.task.execution.thread-name-prefix=MyAsyncExecutor-