Spring @Transactional 属性是否适用于私有方法?
如果我在 Spring bean 的私有方法上有一个@Transactional
-annotation,那么这个注解有什么作用吗?
如果@Transactional
注释在公共方法上,它会起作用并打开一个事务。
public class Bean {
public void doStuff() {
doPrivateStuff();
}
@Transactional
private void doPrivateStuff() {
}
}
...
Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();
-
问题不是私有的或公共的,问题是:它是如何调用的以及您使用哪个 AOP 实现!
如果您使用(默认)Spring Proxy AOP,那么
@Transactional
只有在调用通过代理时才会考虑 Spring 提供的所有 AOP
功能(如 )。 -- 如果从另一个 bean调用带注释的方法,通常会出现这种情况。这有两个含义:
- 因为不能从另一个 bean 调用私有方法(反射除外),所以它们的
@Transactional
Annotation 不被考虑在内。 - 如果该方法是公共的,但它是从同一个 bean 调用的,则它也不会被考虑(此语句仅在使用(默认)Spring Proxy AOP 时才正确)。
恕我直言,您应该使用 aspectJ 模式,而不是 Spring 代理,这将解决问题。AspectJ Transactional Aspects
甚至被编织到私有方法中(针对 Spring 3.0 进行了检查)。 - 因为不能从另一个 bean 调用私有方法(反射除外),所以它们的