如何解决子接口中重写的事务注释方法是否仍将启动事务
| 考虑带有Spring的Java应用程序的这种情况:public interface FooDao {
@Transactional
void save(Foo foo);
}
public interface SecureFooDao extends FooDao {
@Secured({Role.ADMIN})
void save(Foo foo);
}
我的问题是这个;会在SecureFooDao接口上调用save来启动事务,还是会忽略重写的方法注释?
解决方法
从Spring参考10.5.6使用@Transactional
小费
Spring建议您仅使用@Transactional注释对具体类(以及具体类的方法)进行注释,而不是对接口进行注释。您当然可以在接口(或接口方法)上放置@Transactional批注,但这仅在您使用基于接口的代理时才可以使用。 Java注释不是从接口继承的事实意味着,如果您使用的是基于类的代理(proxy-target-class = \“ true \”)或基于编织的方面(mode = \“ aspectj \”),则代理和编织基础结构无法识别事务设置,并且该对象也不会包装在事务代理中,这肯定是不好的。
因此,即使不被覆盖,它也只能在使用Spring-Aop-Proxies(我不推荐)的情况下起作用,而对于AspectJ或CGILib代理则无效!
但我不希望这项工作适用于在接口中重写的方法,即使对于Spring-Aop-Proxies也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。