@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)解决同类方法调用时异步和事务不生效:

我们在开启springboot启动类上添加@EnableAsync,从而启动异步注解@Async

启动之后,我们可以在需要异步执行的方法上面添加@Async注解,即可实现异步,但是有一点,如果我们需要用同一个类中的方法调用另一个加了@Async注解的方法,这时@Async不起作用,原因和事务注解@Transactional失效的原因一样,没有用到代理类导致,这时我们可以通过在启动类添加@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)来解决问题。

该注解两个参数作用分别为:

    一个是控制aop的具体实现方式,为true的话使用cglib,为false的话使用java的Proxy,默认为false。
    第二个参数控制代理的暴露方式,解决内部调用不能使用代理的场景,默认为false。

具体解决办法:

/**
* 1、首先要知道spring的aop切面的原理是什么?
* 答:Spring是采用动态代理(AOP)实现对bean的管理和切片,它为我们的每个class生成一个代理对象。
* 只有在代理对象之间进行调用时,可以触发切面逻辑,也就是切面才可以切进去,才能执行切面里编写的代码。
* 而在同一个class中,方法B调用方法A,调用的是原对象的方法,而不通过代理对象。所以Spring无法切到这次调用。
* 2、所以想必你大致也明白了为什么在同一个类里面一个方法调用另外一个带有@Async的方法不起作用了?
* 不仅仅是这个,同一个类里面一个方法调用另外一个开启事物(@Transactional)的的方法,事物也是不起作用的。
* 3、自定义的注解在同一个类里面方法调用也是不起作用的,总的来说同一个类里面总的来说只要是同一个类里面的方法间调用,
* 那么切面都是无效的,aop都无法切入进入。
* 4、解决办法用AopContext.currentProxy()获取一个代理类,然后用代理类再去调用就好了 代码示例:
*/
@Service
public
class serviceImpl implements service { @Async
@TargetDataSource("db1")
@Override
public void do(String value) {
/**
* 获取本对象的代理对象,再进行调用这个类里面的其他方法,那么被调用的那个方法上面如果有切面
* 那么切面就可以生效了,本代码示例就是在开启事物之前先动态切换数据源,
* 这样下面的dosomething上的@Transactional开启事物方法就可以生效了,
* 动态切换数据源要注意一个问题,就是在开启事物之前要先切换成需要的数据源,不要在开启事物
* 之后在切换数据源不然会切换失败,因为一个事物的开启是建立在与一个数据源建立连接的基础上开启的
* 所以如果先开启事物然后再切换数据源会报错,切换会失败
*/
((serviceImpl) AopContext.currentProxy()).dosomething(value);
} /**
* 要注意
* @Transactional是否是生效的
*
* @param value
*/
@Transactional
@Override
public void dosomething(String value) {
//dosomething()
}
}

————————————————
版权声明:本文为CSDN博主「LiZhen798」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LiZhen314/article/details/120495143

@EnableAspectJAutoProxy 注解的作用 —— 转载的更多相关文章

  1. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  2. 使springAOP生效不一定要加@EnableAspectJAutoProxy注解

    在上篇文章<springAOP和AspectJ有关系吗?如何使用springAOP面向切面编程>中遗留了一个问题,那就是在springboot中使用springAOP需要加@EnableA ...

  3. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  4. @ModelAttribute注解的作用

    @ModelAttribute注解的作用:1.放在方法上注解不带属性: 方法无返回值: 执行其他方法时,先执行该注解标记方法. 如果方法中有将一些属性放入model的操作,其他方法model中也会共享 ...

  5. @interface注解类、 @Target:注解的作用目标 @Retention

    public @interface xxx 定义注解 @interface 不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个 ...

  6. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 注解的作用

    在学习boot 项目的时候 ,发现在启动类中有一个这个的注解 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ...

  7. @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】

    转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317   Quartz定时任务默认都是并发执行 ...

  8. 深入理解Java:注解(Annotation)自定义注解入门(转载)

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  9. struts2注解的作用

    Struts2注解 1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包, ...

  10. @responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object

    @responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object 2.也可以再方法上添加@ResponseBody注解, 用于这个类里 ...

随机推荐

  1. 数据库多表连接查询中使用group by分组语句,Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXX' which is not functionally dependent on columns in GROUP BY claus

    需求描述: 要是用两表联合查询,并对查询的结果进行分组:sql如下: 1 SELECT 2 a.`id`, 3 a.`fr_num`, 4 b.`ent_status` 5 FROM 6 `table ...

  2. VUE学习-列表渲染

    列表渲染 v-for <!-- v-for="(v,k,i) in arr/obj" --> <ul id="app"> <li ...

  3. js开发环境如何解决跨域问题

    问题 npm start之后,自己会启动一个端口,比如3000,调用后端服务(比如localhsot:3006/service/list)就会出现跨域,那怎么弄呢? 方式一: webpack设置pro ...

  4. CSS主要整理

    css主要整理 // 右侧悬浮导航 /* 侧栏开始 */ #home { position: relative } // 悬浮 #home .xf { width: 67.6923076923077p ...

  5. docker搭建图片压测QPS3000+服务器(ftp+nginx)

    docker搭建图片压测QPS3000+服务器(ftp+nginx) 在针对图片算法服务进行压力测试时,需要高性能的图片服务器 自己编写的图片应用性能不一定能达到要求 可能因为图片应用自身达不到压测要 ...

  6. iOS开发之UIImage在压缩时失真问题,压缩图片的大小

    今天遇到UIImage在压缩时失真问题,压缩图片的大小图片模糊 错误的方案 /** * 压缩图片 * image:将要压缩的图片 size:压缩后的尺寸 */ -(UIImage*) OriginIm ...

  7. 068_Apex&Page中的ReadOnly 使用方式

    一.page页面遇到需要检索大量数据的处理方式需要时会用Readonly 通常,对单个Visualforce页面请求的查询可能无法检索超过50,000行. 在Read only模式下,此限制将放宽允许 ...

  8. js树搜索框查询所有匹配节点及父节点(纯js实现)

    // 搜索框输入查询树节点(纯前台js) //name 搜索框输入的值: //wgObj.dwtreeDateAll 为树 的全量数据 // titleArr 与输入框匹配的节点数组 //arrTar ...

  9. driver报错

    self.driver = webdriver.Chrome(),突然报错,运行不了 解决办法: 第一步:去检查你以安装的驱动版本,用cmd打开命令提示符:然后用命令:chromedriver 第二步 ...

  10. vscode plugin - jenkins jack使用方法

    Jenkins jack用于使vscode可直连jenkins,能推送代码至对应jenkins job进行代码测试 一.vscode安装jenkins jack 二.连接jenkins 根据提示输入j ...