@EnableAsync父注解和@Async子注解(经常用法)

文章讨论了在SpringBoot项目中使用@EnableAsync时遇到的问题,即当方法实现接口并使用异步时,默认CGLIB代理可能导致错误。解决方案是通过在@EnableAsync上设置proxyTargetClass=true,强制使用CGLIB动态代理。

SpringBoot项目中的用法:

@EnableAsync

在哪个模块使用异步那么启动类必须要加上。
@Async
一般是加载没有实现接口得到方法上,为什么呢?因为默认使用的是CGLIB动态代理,而实现了接口又重写了接口中对应的方法,这个异步的代理就会走JDK动态代理,此时会报错如下:
 @Async
@Override(此时实现了接口中的方法又使用了异步,那么如果不强制那么就会报错。)
public Future<R<Boolean>> getByUserId(String userId):

> Action:
> 
> Consider injecting the bean as one of its interfaces or forcing the
> use of CGLib-based proxies by setting proxyTargetClass=true on
> @EnableAsync and/or @EnableCaching.

解决方案:
	在父注解上加上强制使用CGLIB动态代理的配置:@EnableAsync(proxyTargetClass = true)
### 作用与区别分析 #### `@EnableAsync` 的作用 `@EnableAsync` 是 Spring 框架中用于启用异步方法执行的注解,通常标注在配置类上。它的核心作用是激活 Spring 应用上下文中对 `@Async` 注解的支持,使得被 `@Async` 标注的方法能够以异步方式执行。底层通过 Spring 的 AOP 机制实现,基于代理对象来拦截对异步方法的调用,并将其提交到任务执行器(如线程池)中执行 [^3]。 在未启用 `@EnableAsync` 的情况下,即使方法上标注了 `@Async`,也不会触发异步行为,而是以同步方式执行。因此,该注解是整个异步机制的启动开关 [^1]。 示例配置如下: ```java @Configuration @EnableAsync public class AsyncConfig { } ``` #### `@Async` 的作用 `@Async` 是 Spring 提供的用于声明某个方法应以异步方式执行的注解,通常标注在具体的服务方法上。它允许方法在独立线程中运行,从而避免阻塞主线程,提高系统响应效率。该注解依赖于 `@EnableAsync` 的启用,并通过 Spring 的任务执行基础设施(如线程池)进行调度 [^2]。 使用 `@Async` 时,需注意以下限制: - 方法必须是 `public`,不能是 `private`、`protected` 或 `final`。 - 异步方法不能与调用方在同一个类中,否则代理机制失效。 - 返回值类型应为 `void` 或 `Future`(包括 `CompletableFuture`) [^1]。 示例代码如下: ```java @Service public class MyService { @Async public void performAsyncTask() { // 异步执行的逻辑 } } ``` #### `@EnableAsync` 与 `@Async` 的区别 - **作用层级不同**:`@EnableAsync` 是全局配置级别的注解,用于开启整个 Spring 应用的异步功能;而 `@Async` 是方法级别的注解,用于指定某个方法应以异步方式执行 。 - **依赖关系不同**:`@Async` 的生效依赖于 `@EnableAsync` 的存在。如果未启用 `@EnableAsync`,则 `@Async` 注解不会产生任何异步行为 [^1]。 - **功能定位不同**:`@EnableAsync` 负责激活异步处理机制,为后续的异步方法调用提供支持;而 `@Async` 则负责具体方法的异步执行定义 [^2]。 #### 异常与事务管理注意事项 当 `@Async` 方法与事务管理注解 `@Transactional` 同时使用时,由于异步方法在独立线程中执行,事务上下文不会自动传播到新线程中,导致事务控制失效。解决方法是将事务逻辑封装在异步方法内部调用的方法上,并在该方法上添加 `@Transactional` 注解 [^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值