all

Spring @Transactional 属性是否适用于私有方法?

发布于 2022-05-26 22:44:45

如果我在 Spring bean 的私有方法上有一个@Transactional
-annotation,那么这个注解有什么作用吗?

如果@Transactional注释在公共方法上,它会起作用并打开一个事务。

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

  }
}

...

Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();
关注者
0
被浏览
29
1 个回答
  • 面试哥
    面试哥 2022-05-26
    为面试而生,有面试问题,就找面试哥。

    问题不是私有的或公共的,问题是:它是如何调用的以及您使用哪个 AOP 实现!

    如果您使用(默认)Spring Proxy AOP,那么@Transactional只有在调用通过代理时才会考虑 Spring 提供的所有 AOP
    功能(如 )。 -- 如果从另一个 bean调用带注释的方法,通常会出现这种情况。

    这有两个含义:

    • 因为不能从另一个 bean 调用私有方法(反射除外),所以它们的@TransactionalAnnotation 不被考虑在内。
    • 如果该方法是公共的,但它是从同一个 bean 调用的,则它也不会被考虑(此语句仅在使用(默认)Spring Proxy AOP 时才正确)。

    @参见Spring 参考:第 9.6 章 9.6
    代理机制

    恕我直言,您应该使用 aspectJ 模式,而不是 Spring 代理,这将解决问题。AspectJ Transactional Aspects
    甚至被编织到私有方法中(针对 Spring 3.0 进行了检查)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看