当前位置:网站首页>@Transactional注解在类上还是接口上使用,哪种方式更好?
@Transactional注解在类上还是接口上使用,哪种方式更好?
2022-07-30 20:15:00 【葬心啊】
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
Spring @Transactional想必大家都很熟悉,那它是在类上或实现类的方法上和在接口上或接口方法上哪种使用方式是更好的选择呢?
@Transactional介绍
@Transactional 是Spring提供的声明式事务管理,使用起来简单、方便,又能和业务逻辑解耦。
Spring的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
Spring的动态代理
Spring AOP是通过动态代理实现的。如果代理对象实现了接口,默认使用JDK的动态代理,反之没有实现接口则使用cglib的动态代理。
言归正传
回到问题上,在正确使用@Transactional注解时,不管@Transactional注解是在类上或实现类的方法上还是在接口上或接口方法上,它的事务功能都是可以实现的,只是选择那种方式更优雅一点而已。
Spring官方文档是这样写的:
Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Transactional annotation, as opposed to annotating interfaces. You certainly can place the @Transactional annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies ( proxy-target-class=“true”) or the weaving-based aspect ( mode=“aspectj”), then the transaction settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a transactional proxy, which would be decidedly bad.
翻译过来大概意思是 Spring官方建议在具体的类或类的方法上使用@Transactional注解,而不是在接口或接口方法上使用。@Transactional也可以在接口上使用,但是这仅限于你使用的是基于接口的动态代理。在java中注解是不会被继承的,如果使用的是基于类的动态代理或者使用aspectj,@Transactional注解的作用就失效了。
总结
Spring 官方建议还是在具体的类上或类的方法上。我本人赞同Spring官方的观点,事务也是一个实现细节,它应该在具体的类上或方法上,到底具体的实现是否是需要事务要看具体的实现细节。
当然,不是说一定要选择将@Transactional使用在具体类或者方法上一定是最好的,如果项目架构更适合用接口的动态代理,将@Transactional注解应用到接口或者接口方法上也是可以的。一定要选择一个最合适自己的,如果没有找到最合适自己的,那就选择一个大多数人都认为好的。
能力一般,水平有限,如有错误,请多指出。如果对你有用点个关注给个赞呗
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- idea plugins搜索不到插件
- HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
- Based on the face of the common expression recognition - model building, training and testing
- WPS表格怎么自动1234排下去?wps表格怎么自动生成序号?
- 网络层协议------IP协议
- How to copy table structure and table data in MySQL
- SQLyog注释 添加 撤销 快捷键
- 历史上的今天:Win10 七周年;微软和雅虎的搜索协议;微软发行 NT 4.0
- Database Tuning - Database Tuning
- Network layer protocol------IP protocol
猜你喜欢
![KEIL problem: [keil Error: failed to execute 'C:\Keil\ARM\ARMCC']](/img/24/762cec2b4495e80a3e45fac1fac13e.png)
KEIL problem: [keil Error: failed to execute 'C:\Keil\ARM\ARMCC']

To the operation of the int variable assignment is atom?

【PM专用】快速统计团队还有谁没有登记上报信息,快速筛选出属于自己项目组的成员,未完成XXX工作事项的名单
![[NISACTF 2022]下](/img/f7/264fbbf3ffc986b9759912c310a080.png)
[NISACTF 2022]下

湖仓一体电商项目(四):项目数据种类与采集

5分钟搞懂MySQL - 行转列

GateWay实现负载均衡

M3SDA: Moment matching for multi-source domain adaptation

MySQL8重置root账户密码图文教程

【Codeforces思维题】20220728
随机推荐
时间复杂度与空间复杂度
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
普通的int main(){}没有写return 0;会怎么样?
JUnit 5测试中的临时目录(附实例及代码)
MySQL database --- Addition, deletion, modification and query of MySQL tables (advanced)
为单行查询设置JDBC Statement.setFetchSize()为1的方法指南
啊?现在初级测试招聘都要求会自动化了?
excel数字下拉递增怎么设置?
Common Expression Recognition Based on Face (1) - Basic Knowledge of Deep Learning
Interviewer Ali: Describe to me the phenomenon of cache breakdown, and talk about your solution?
推荐系统-模型:FNN模型(FM+MLP=FNN)
ELK log analysis system
4年测试经验去面试10分钟就被赶出来了,面试官说我还不如应届生?都这么卷吗...
如何优化OpenSumi终端性能?
360杜跃进:太空安全风险加剧,需打造一体化防御体系
明解C语言第六章习题
英文字母间隔突然增大(全角与半角转换)
Install Mysql5.7 under Linux, super detailed and complete tutorial, and cloud mysql connection
如何解决gedit 深色模式下高亮文本不可见?
vlookup函数匹配不出来的原因及解决方法