首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我应该把@Transactional注释放在哪里:在接口定义上还是在实现类上?

我应该把@Transactional注释放在哪里:在接口定义上还是在实现类上?
EN

Stack Overflow用户
提问于 2010-06-26 01:41:40
回答 3查看 35K关注 0票数 97

代码中标题中的问题:

代码语言:javascript
复制
@Transactional (readonly = true)
public interface FooService {
   void doSmth ();
}


public class FooServiceImpl implements FooService {
   ...
}

vs

代码语言:javascript
复制
public interface FooService {
   void doSmth ();
}

@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
   ...
}
EN

回答 3

Stack Overflow用户

发布于 2010-06-26 02:06:42

Spring的recommendation是注释具体的实现,而不是接口。在接口上使用注释并不是不正确的,只是可能会误用该功能并无意中绕过您的@Transaction声明。

如果您在接口中标记了事务性的东西,然后在spring中的其他地方引用了它的实现类之一,那么spring创建的对象是否会不遵守@Transactional注释并不是很明显。

在实践中,它看起来像这样:

代码语言:javascript
复制
public class MyClass implements MyInterface { 

    private int x;

    public void doSomethingNonTx() {}

    @Transactional
    public void toSomethingTx() {}

}
票数 11
EN

Stack Overflow用户

发布于 2015-03-29 00:43:05

在具体类上支持@Transactional:

我更喜欢用3个部分来构建一个解决方案: API、实现和Web (如果需要)。我尽量通过最小化依赖来保持API的轻量级/简单性/POJO。如果你在一个分布式/集成的环境中玩它,这一点尤其重要,因为你必须大量共享API。

将@Transactional放在API部分需要Spring库,而IMHO是无效的。所以我更喜欢将它添加到事务正在运行的实现中。

票数 1
EN

Stack Overflow用户

发布于 2010-06-26 01:53:30

只要你的IFC的所有可预见的实现者都关心TX数据(事务不仅仅是数据库要处理的问题),那么把它放在接口上就可以了。如果这个方法不关心TX (但是你需要把它放在Hibernate或者其他什么地方),把它放在impl上。

此外,将@Transactional放在接口中的方法上可能会更好:

代码语言:javascript
复制
public interface FooService {
    @Transactional(readOnly = true)
    void doSmth();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3120143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档