spring中某方法@Transactional 设置了propogation后,能在方法中修改方法的事务传播属性吗?
譬如
@Transactional(propagation = Propagation.REQUIRES_NEW))
void doSomething(){}
@Transactional
void caller(){
//修改doSomething的事务传播属性为Propagation.REQUIRED
doSomething();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不能...如果只是普通的修改一个方法的注解值的话可以通过反射办到
但是Spring实际上加载使用的是你原来类后生成的代理类 也就是说你得直接改他的代理类才行
但也不排除什么黑科技操作...不过以我的姿势水平来说是不能的
题主你好,这个问题的回答,我觉得理论上可以,为啥说是理论呢
因为你的最终目标可能应该是可以在运行时动态改变注解中的属性值
所以这里涉及两个问题
Java
本身语法层面上是否支持可以修改第一个问题是纯语法问题,先不提,这里先要说明哈第二个问题,因为
Transactional
注解是Spring
的提供的配置注解,所以就算修改了Transactional
中的属性值,运行时应该不是采用实时Transactional
注解的新值,应该这类配置都是在Spring
初始化时,就另外对象包装存储起来的,类似缓存起来,所以这点我没有深究,但是理论上改完Spring
缓存值应该最终能达到目的。除非完全保护起来不允许修改,但是这个保护机制是Spring
提供,并不涉及第一个问题再来说说第一个问题,起初看到这个问题,我是这么想的,注解本身就是一个接口,而注解存在的地方其实就是这个接口的一个实现类,一个实例对象,所以换句话说其实就是改变实例对象的属性值,这个再怎么也应该可以做到,只是这些注解实例应该有一个地方存储,这个地方我之前没有了解过,但我觉得应该存在,最后我查找了一些资料了解了以下处理方式,仅供参考
假设我们一个类注解
我们创建一个测试类
TestClass
,然后给它加上这个注解ClassAnnotation
平常我们在获取注解
ClassAnnotation
时,其实一般都是这么做的但是我们获取出来
classAnnotation
对象其实是一个代理对象这里我们可以拿到这个代理类的
InvocationHandler
类,然后InvocationHandler
中一个属性memberValues
,而这个memberValues
属性其实是一个map
,而这个map
就是存储的这个注解中定义的各种属性信息,包括属性名和值,key
是属性名,value
是属性值,因此只用修改对应的属性名的属性值即可所以就可以写出这样一个工具方法
changeAnnotationValue
然后用这个方法,我们可以做一个测试
运行结果
当然方法类注解或者字段类注解同理
以上就是语法层面的修改,
Spring
层面上的修改,我没有细追,不过我觉得是可以的,我只是简单测试过RequestMapping
注解的method
属性,之前只支持GET
,后面改为只支持POST
,并不会生效,所以我觉得Transactional
注解应该也是类似,毕竟Spring
肯定需要统一管理这些注解配置,而不会去原值读取如果题主最终找出解决方案,麻烦更新分享哈,我后面有空了也会去追哈源码看看,谢谢啦