【发布时间】:2014-05-19 19:35:49
【问题描述】:
来自弹簧参考文档
Spring 建议您仅使用 @Transactional 注释来注释具体类(和具体类的方法),而不是注释接口。您当然可以将@Transactional 注释放在接口(或接口方法)上,但这仅在您使用基于接口的代理时才起作用。 Java 的事实 注释不是从接口继承的,这意味着如果您使用基于类的代理 (proxy-target-class="true") 或基于编织的方面 (mode="aspectj"),则事务设置不会被代理和编织基础设施,并且对象不会被包装在事务代理中,这绝对是糟糕的。
虽然它只谈论接口,但抽象类也被认为是非具体的。
如果我有一个抽象类
public abstract class BaseService{
//here is a concrete method
@Transactional
public void updateData{
//do stuff using dao layer
}
以及扩展类的具体类
public class SpecialService extends BaseService{
//body of class
}
现在,如果我从我的控制器类调用 specialService.updateData(),它会是事务性的吗?
【问题讨论】:
-
尝试时会发生什么?
-
当我在抽象类上尝试 @Transactional 时。 Spring 报告了一个不同的错误:一个组件需要一个无法找到的“mypackage.ActivityService”类型的 bean。只要我从抽象类中取消注释 Transactional 注释,就可以了。
标签: spring transactions spring-transactions