Spring事务内方法调用自身事务 增强的三种方式
ServiceA.java文件:
查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是callSelf方法却没有被事务增强;
分析原因:Spring事务生成的对象也是被Cglib或JDK代理的对象,就区别于该对象本身了,
代理的对象执行方法之前会走拦截器链,就不能同this方法.
解决方案:
- 使用Autowired注解将自身注入,然后调用注入属性的方法;
验证输出结果: 确实初始化了callSelf的事务;
2.之前Aop可以将代理对象暴露到当前线程局部变量中;
<aop:aspectj-autoproxy expose-proxy="true"/>
通过尝试发现,SpringTx也可以使用该配置,将创建的对象加入到当前线程局部变量;
也许觉得SpringAop和SpringTx不一样啊,但其实两者都实现了AbstractAutoProxyCreator类,同样设置expose-proxy也能生效,绑定到线程局部变量上;
调用方式如下:
验证输出结果:可以看到确实 callSelf方法也被Spring事务增强到了.
3.按照道理来说tx:annotation-driven标签应该也有expose-proxy属性,但是很不幸:
<tx:annotation-driven>标签确实不允许expose-proxy属性设置,有proxy-target-class属性;
查看AopNamespaceUtils的useClassProxyingIfNecessary方法:
Line 91-94行是用来解析标签时候定义expose-proxy、proxy-target-class两个属性,Aop以及Tx都会调用这个方法, 问题就是这里了, <aop:aspectj-autoproxy>标签约束里有expose-proxy,
那可以解析,但是<tx:annotation-driven>标签没有expose-proxy我解析啥子呢,
改动下解析Tx标签时,将expose-proxy设置为true; (此处涉及到改动源代码,jar包是无法直接修改的,我修改的Spring的源码,如果需要导入Spring的jar包 然后在修改之后导出成jar包)
验证下输出结果: 可以看到也实现了调用自身方法, 其实和方法二应该是一个意思;
附上笔记地址:
Spring事务内方法调用自身事务 增强的三种方式的更多相关文章
- 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件 内容简介:本文介绍 Spring Boot 的配置文件和配置管理,以及介绍了三种读取配置文 ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- 上手spring boot项目(三)之spring boot整合mybatis进行增删改查的三种方式。
1.引入依赖. <!--springboot的web起步依赖--><dependency> <groupId>org.springframework.boot< ...
- shell调用另一个脚本的三种方式fork/exec/source
exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两 ...
- spring mvc从前台往后台传递参数的三种方式
jsp页面: 第一种:使用控制器方法形参的方式(常用) 第二种:使用模型传参的方式(如果前台往后台传递的参数非常多,如果还使用形参的方式传递,非常复杂.我们可以使用模型传参的方式,把多 个请求的参数 ...
- Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式
直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...
- spring学习笔记2---MVC处理器映射(handlerMapping)三种方式(附源码)
一.根据Beanname访问controller: 在springmmvc-servlet.xml的配置handlermapping中加入beanname,通过该beanname找到对应的contro ...
- spring mvc从后台往前台传参数的三种方式
第一种:使用Model对象(常用) 第一步:使用model对象往前台传递数据 第二步:在jsp中接收从后台传递过来的参数 第二种:使用HttpServletRequest对象 第一步:使用HttpSe ...
- spring中创建bean对象的三种方式以及作用范围
时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...
随机推荐
- POJ3177tarjan缩点_构建双连通图
POJ3177tarjan缩点_构建双连通图 根据题意利用tarjan算法进行缩点处理后变成连通无环图,也可以说是一颗树,而且边是双向的所以,如果把这个图变成双连通,那就要对所有度为1的点进行加边处理 ...
- HDU2844买表——多重背包初探
HDU2844买表多重背包问题题目大意都不大好懂,是利用手头上的硬币看看能组合出多少种价格,也就是跑完背包,看看有多少背包符合要求 剩下的就是多重背包的问题了1.第一个处理办法就是直接当01背包进行存 ...
- shell 命令 rz sz
尝试了几个版本,下面的是可用的 https://segmentfault.com/a/1190000012166969
- cxRichEdit1获取EXCEL的区域图片
cxRichEdit1获取EXCEL的区域图片 搞了好久却原来其实太简单: cxRichEdit1.Clear;Clipboard.Clear;ActiveSheet.cells[2, iCol] ...
- Delphi 与 Word_VBA
'插入表格Sub setTable() Set myRange = ActiveDocument.Range(Start:=2, End:=2) ActiveDocument.Tables.Add ...
- JS中图片飞飞效果
当鼠标在界面上移动的时候,后面有一连串的图片跟随者一起飘动,效果如下: 实现的基本思想:准备五个img标签,为了方便控制都放在一个div里面,设置div的定位方式为 fixed,设置成这中定位方式主要 ...
- 使用EF6连接mariaDB出现中文查找不到数据的问题
1.问题描述 这两天使用ef6.0查询mariaDB出现了数据查询不到的情况 2.问题分析 后来发现除了这段数据查询不到,其他都能查询,于是逐步对比代码,发现其他数据都是英文的,而这句是中文的于是把条 ...
- ovs flow 命令集
流表可以有多个执行动作,是从左向右以此执行,常用动作如下: output:port: 输出数据包到指定的端口.port 是指端口的 OpenFlow 端口编号 group:group_id 输出数据包 ...
- Flask系列05--Flask的配置config
一.flask配置 示例说明, 就是使用config进行配置 from flask import Flask app = Flask(__name__) # type:Flask app.conf ...
- vscode 学习笔记 —— 重构
一.vscode 自带 1.提取变量 2.提取方法 上面都是通过选中文本后出现的小灯泡操作的: 3.全局替换(多个文件中的)某个变量 选中变量按 F2,输入完成后按回车 二.vscode 插件 js- ...