在子接口中重写的事务性注解方法是否仍会启动事务

发布于 2024-11-01 13:56:53 字数 296 浏览 0 评论 0原文

考虑使用 Spring 的 Java 应用程序的这种场景:

public interface FooDao {
    @Transactional
    void save(Foo foo);
}

public interface SecureFooDao extends FooDao {
    @Secured({Role.ADMIN})
    void save(Foo foo);
}

我的问题是这样的;在 SecureFooDao 接口上调用 save 会启动事务,还是会忽略重写方法注释?

Consider this scenario for a Java application with Spring:

public interface FooDao {
    @Transactional
    void save(Foo foo);
}

public interface SecureFooDao extends FooDao {
    @Secured({Role.ADMIN})
    void save(Foo foo);
}

My question is this; will calling save on a SecureFooDao interface start a transaction, or will it ignore the overriden methods annotations?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

愚人国度 2024-11-08 13:56:53

来自Spring参考 10.5.6 使用@Transactional

提示

Spring 建议您仅使用 @Transactional 注释来注释具体类(以及具体类的方法),而不是注释接口。您当然可以将 @Transactional 注释放在接口(或接口方法)上,但这仅在您使用基于接口的代理时按照您期望的方式工作。 Java 注释不是从接口继承的事实意味着,如果您使用基于类的代理 (proxy-target-class="true") 或基于编织的切面 (mode="aspectj"),则事务设置为代理和编织基础设施无法识别,并且该对象不会被包装在事务代理中,这绝对是糟糕的。

因此,即使不重写,它也只能在您使用 Spring-Aop-Proxies(我不推荐)时才有效,但不适用于 AspectJ 或 CGILib 代理!

但我不希望这适用于在接口中重写的方法,甚至不适用于 Spring-Aop-Proxies。

From Spring reference 10.5.6 Using @Transactional

Tip

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.

So even not overriden it will only work if you use Spring-Aop-Proxies (which I can not recommend), but not for AspectJ or CGILib Proxies!

But I do not expect that this work for an method that is overriden in an Interface, even not for Spring-Aop-Proxies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文