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

时间:2011-04-14 17:06:48

标签: java spring transactions

考虑使用Spring的Java应用程序的这种情况:

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

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

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

1 个答案:

答案 0 :(得分:2)

来自Spring参考10.5.6 Using @Transactional

  

提示

     

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

所以,即使没有覆盖它,只有你使用Spring-Aop-Proxies(我不推荐),但不适用于AspectJ或CGILib Proxies!

但我不希望这对于在接口中覆盖的方法起作用,即使对于Spring-Aop-Proxies也不行。