为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2019-07-27 15:15:15
Spring@Transaction属性在私有方法上工作吗?如果我有对Springbean中的私有方法进行注释,注释有效果吗?如果@Transactional注释在公共方法上,它工作并打开事务。public class Bean {   public void doStuff() {      doPrivateStuff();   }   @Transactional   private void doPrivateStuff() {   }}...Bean bean = (Bean)appContext.getBean("bean");bean.doStuff();
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞


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

如果您使用(默认)Spring代理AOP,那么Spring提供的所有AOP功能(如@Transational)只有在调用通过代理时才会考虑。-通常情况下,如果从另一个豆子。

这有两个含义:

  • 因为不能从另一个bean调用私有方法(例外是反射),所以它们的

    @Transactional

    注释没有被考虑在内。
  • 如果该方法是公共的,但它是从同一个bean调用的,那么它也不会被考虑(只有在使用了Spring代理AOP(默认)时,这个语句才是正确的)。

@见弹簧参考:第9.6章代理机构

您应该使用AspectJ模式,而不是Spring代理,这将解决问题。AspectJ事务方面甚至被编织成私有方法(Spring3.0检查)。


查看完整回答
反对 回复 2019-07-28
?
弑天下

TA贡献1818条经验 获得超7个赞


默认情况下,@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任何方法上的运行时行为。




查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 806 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信