Spring@Transaction属性在私有方法上工作吗?

Spring@Transaction属性在私有方法上工作吗?

如果我有对Springbean中的私有方法进行注释,注释有效果吗?

如果@Transactional注释在公共方法上,它工作并打开事务。

public class Bean {
  public void doStuff() {
     doPrivateStuff();
  }
  @Transactional
  private void doPrivateStuff() {

  }}...Bean bean = (Bean)appContext.getBean("bean");bean.doStuff();


牛魔王的故事
浏览 415回答 4
4回答

慕虎7371278

Spring@Transaction属性在私有方法上工作吗?如果我有对Springbean中的私有方法进行注释,注释有效果吗?如果@Transactional注释在公共方法上,它工作并打开事务。public class Bean {   public void doStuff() {      doPrivateStuff();   }   @Transactional   private void doPrivateStuff() {   }}...Bean bean = (Bean)appContext.getBean("bean");bean.doStuff();

慕婉清6462132

问题不是私有的,也不是公开的,问题是:它是如何被调用的,以及您使用的是哪个AOP实现!如果您使用(默认)Spring代理AOP,那么Spring提供的所有AOP功能(如@Transational)只有在调用通过代理时才会考虑。-通常情况下,如果从另一个豆子。这有两个含义:因为不能从另一个bean调用私有方法(例外是反射),所以它们的@Transactional注释没有被考虑在内。如果该方法是公共的,但它是从同一个bean调用的,那么它也不会被考虑(只有在使用了Spring代理AOP(默认)时,这个语句才是正确的)。@见弹簧参考:第9.6章代理机构您应该使用AspectJ模式,而不是Spring代理,这将解决问题。AspectJ事务方面甚至被编织成私有方法(Spring3.0检查)。

炎炎设计

默认情况下,@Transactional属性仅在对从applicationContext获得的引用调用带注释的方法时才有效。public class Bean {   public void doStuff() {     doTransactionStuff();   }   @Transactional   public void doTransactionStuff() {   }}这将打开一个事务:Bean bean = (Bean)appContext.getBean("bean");bean.doTransactionStuff();这不会:Bean bean = (Bean)appContext.getBean("bean");bean.doStuff();Spring引用:使用@Transaction注意:在代理模式下(这是默认的),只有通过代理传入的“外部”方法调用才会被截获。这意味着“自调用”,即在目标对象中调用目标对象的其他方法的方法,即使被调用的方法被标记为在运行时也不会导致实际事务。@Transactional!考虑使用AspectJ模式(请参见下面),如果您希望自己的调用也与事务一起包装。在这种情况下,首先不会有代理;相反,目标类将被“编织”(即它的字节代码将被修改),以便@Transactional任何方法上的运行时行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java