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

回到顶部