代码中标题中的问题:
@Transactional (readonly = true)
public interface FooService {
void doSmth ();
}
public class FooServiceImpl implements FooService {
...
}
vs
public interface FooService {
void doSmth ();
}
@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
...
}
发布于 2010-06-26 02:06:42
Spring的recommendation是注释具体的实现,而不是接口。在接口上使用注释并不是不正确的,只是可能会误用该功能并无意中绕过您的@Transaction声明。
如果您在接口中标记了事务性的东西,然后在spring中的其他地方引用了它的实现类之一,那么spring创建的对象是否会不遵守@Transactional注释并不是很明显。
在实践中,它看起来像这样:
public class MyClass implements MyInterface {
private int x;
public void doSomethingNonTx() {}
@Transactional
public void toSomethingTx() {}
}
发布于 2015-03-29 00:43:05
在具体类上支持@Transactional:
我更喜欢用3个部分来构建一个解决方案: API、实现和Web (如果需要)。我尽量通过最小化依赖来保持API的轻量级/简单性/POJO。如果你在一个分布式/集成的环境中玩它,这一点尤其重要,因为你必须大量共享API。
将@Transactional放在API部分需要Spring库,而IMHO是无效的。所以我更喜欢将它添加到事务正在运行的实现中。
发布于 2010-06-26 01:53:30
只要你的IFC的所有可预见的实现者都关心TX数据(事务不仅仅是数据库要处理的问题),那么把它放在接口上就可以了。如果这个方法不关心TX (但是你需要把它放在Hibernate或者其他什么地方),把它放在impl上。
此外,将@Transactional
放在接口中的方法上可能会更好:
public interface FooService {
@Transactional(readOnly = true)
void doSmth();
}
https://stackoverflow.com/questions/3120143
复制相似问题