当前位置: 首页 > 面试题库 >

JavaSpring @Transactional属性可以在私有方法上工作吗?

漆雕宏浚
2023-03-14
问题内容

如果我在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中进行了检查)。



 类似资料:
  • 问题内容: 如果我在Spring bean的私有方法上有一个@Transactional -annotation,该注释有什么作用吗? 如果注释位于公共方法上,则它将起作用并打开一个事务。 问题答案: 本文向大家介绍Spring @Transactional属性可以在私有方法上工作吗?相关面试题,主要包含被问及Spring @Transactional属性可以在私有方法上工作吗?时的应答技巧和注意

  • 在 Python 的面向对象编程中,私有属性是只能在类的实例方法中访问的属性,不允许在外界访问私有属性。 1. 私有属性的定义 1.1 定义 在属性名称前加上前缀 __,表示该属性为私有属性,示例代码如下: class Object: def method(self): self.__private_attribute = 123 在第 3 行,创建一个私有属性 __pr

  • 我有几个用注释的公共方法,IntelliJ显示了警告,它们可以是包私有的,也可以是私有的。 既然用注释的方法应该是公共的,我如何才能在IntelliJ中仅对这些方法禁用此检查/警告?

  • 问题内容: 我试图通过反射获取静态私有属性的值,但失败并显示错误。 我得到的异常是: 而且,我需要使用以下代码来调用一个私有的。 但是问题是Student类是单例类,并且构造函数是私有的,并且无法访问。 问题答案: 您可以将字段设置为可访问:

  • 问题内容: 我有一个使用XML和反射将 s 返回到另一个类的类。 通常,这些对象是外部对象的子字段,但有时我想即时生成它。我已经尝试过类似的方法,但无济于事。我相信这是因为Java不允许你访问进行反射的方法。 如果提供的方法失败,则失败。我可以通过制作方法来解决它,或者制作另一个类来派生它。 长话短说,我只是想知道是否存在一种通过反射访问方法的方法。 问题答案: 你可以使用反射调用私有方法。修改已

  • 问题内容: 我知道我可以使用反射来调用私有方法,并获取或设置私有变量的值,但是我想重写一个方法。 我希望方法 可以打印出来,但是可以打印出来。我听说这可以通过反思来完成,但是我不知道怎么做。如果不是反思,有谁知道另一种方式吗?(除了使方法受保护,或者将方法复制并粘贴到。)如果实际上无法覆盖私有方法,是否可以在其上放置某种触发器以在子类之前或之后调用我的子类中的方法?私有方法执行后? 问题答案: 私