JavaSpring @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,则@Transational
仅当调用通过代理时,才会考虑Spring提供的所有AOP功能(如)。-如果从另一个 bean 调用带注释的方法,通常就是这种情况。
这有两个含义:
- 因为不能从另一个bean调用私有方法(例外是反射),
@Transactional
所以不考虑其注释。 - 如果该方法是公共方法,但是从同一个bean调用,则也不会考虑该方法(仅当使用(默认)Spring Proxy AOP时,此语句才是正确的)。
@See Spring参考:第9.6章9.6代理机制
恕我直言,你应该使用AspectJ模式而不是Spring Proxies来解决问题。而且AspectJ事务性方面甚至被编织成私有方法(已在Spring 3.0中进行了检查)。
以上是 JavaSpring @Transactional属性可以在私有方法上工作吗? 的全部内容, 来源链接: utcz.com/qa/434314.html