@EnableAspectJAutoProxy 注解的作用 —— 转载
@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 注解的作用 —— 转载的更多相关文章
- 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解
写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...
- 使springAOP生效不一定要加@EnableAspectJAutoProxy注解
在上篇文章<springAOP和AspectJ有关系吗?如何使用springAOP面向切面编程>中遗留了一个问题,那就是在springboot中使用springAOP需要加@EnableA ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- @ModelAttribute注解的作用
@ModelAttribute注解的作用:1.放在方法上注解不带属性: 方法无返回值: 执行其他方法时,先执行该注解标记方法. 如果方法中有将一些属性放入model的操作,其他方法model中也会共享 ...
- @interface注解类、 @Target:注解的作用目标 @Retention
public @interface xxx 定义注解 @interface 不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个 ...
- @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 注解的作用
在学习boot 项目的时候 ,发现在启动类中有一个这个的注解 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ...
- @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】
转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317 Quartz定时任务默认都是并发执行 ...
- 深入理解Java:注解(Annotation)自定义注解入门(转载)
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...
- struts2注解的作用
Struts2注解 1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包, ...
- @responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object
@responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object 2.也可以再方法上添加@ResponseBody注解, 用于这个类里 ...
随机推荐
- 周练6(python脚本)
------------恢复内容开始------------ 1.bugku-好像需要密码 POST /?yes HTTP/1.1 Host: 114.67.175.224:11711 User-Ag ...
- 新的学习历程-python2 print
1 print('hello world!') 2 print('hello','world!') #逗号自动添加默认的分隔符:空格 3 print('hello'+'world!') #加号表示字符 ...
- 查电脑并修改IP地址,你晓得吗?
查电脑并修改IP地址,你晓得吗? 好记性不如烂笔头,古人的话,浅显却好有深意,越品越有味道. 每次都会忘记怎么查电脑IP,那么今天就写下来吧! 方法一:通过命令行查询IP地址 快捷键Win ...
- Nginx njs模块注入js
如实现表单代填或者webvpn模式,后续待研究
- 音乐下载器,音乐解析软件,全网音乐免费下载,mp3格式音乐下载,flac格式音乐下载,无损音质音乐下载器,你想听的都搜的到~
在这个音乐版权被三分天下的时代,想必大家也都会有这种的困扰,喜欢的音乐很多,刚好这些音乐的版权还分散在三大主流音乐厂商的手里. 这样的话,想要听或者下载自己喜欢的音乐可能要开多个会员,而且下载的音乐单 ...
- Dockerfile启动镜像报错 invalid reference format: repository name must be lowercase
具体报错信息如下: "user-0.0.1-SNAPSHOT.jar:latest" for "-t, --tag" flag: invalid referen ...
- 云函数调用云函数 openid不存在
最近发现了一个问题 就是我使用云函数调用云函数的时候,将openid存入数据库发现为空,怎么回事呢,一查, 原来是这样 还是没有仔细看文档的错啊
- Robot-Framework 基础操作和常用的语法
1.打开浏览器 Open Browser 2.浏览器最大化 Maximize Browser Window 3.关闭浏览器 Test Teardown Close Browser 4.输入文本框 I ...
- CoreText学习笔记
CoreText是Apple系统的文字渲染引擎. 我们先看一个字符的字形图,了解一下一个字形包含的部分: 它的坐标系为窗口的左下角为视图的原点(跟Mac系统一样的坐标系),而iOS系统的坐标系为窗口的 ...
- mysql学习问题解决
1.字符串转时间格式函数: STR_TO_DATE('2017-10-19 16:47:00', '%Y-%m-%d %H:%i:%s') oracle的为to_date 2.specified tw ...