考虑使用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方法注释?
答案 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也不行。