当前位置: 首页 > 知识库问答 >
问题:

在抽象类和子方法之间使用Spring事务代理

颛孙英才
2023-03-14

我有一个抽象的基本服务和两个实现:

public abstract class AbstractBaseService {
  public void mainProcess() {
    for (Foo foo : getFoos()) {
      doSomething(foo);
    }
  }
  abstract List<Foo> getFoos();
  abstract void doSomething(Foo foo);
}

public class ServiceImplOne extends AbstractBaseService {
  protected List<Foo> getFoos() { ... }
  protected void doSomething(Foo foo) { ... }
}

public class ServiceImplTwo extends AbstractBaseService { ... }

处理@transactional注释的默认建议模式是proxy,它只允许通过代理拦截调用。同一类中的本地调用不能以这种方式被拦截。对于更高级的拦截模式,请考虑结合编译时或加载时编织切换到AspectJ模式。

因此,代理将无法拦截来自同一类内的调用。这是否也适用于抽象类和它的实现之间的调用,或者它会像我想要的那样工作吗?有什么简单的方法可以自己检查吗?(可能是个愚蠢的问题,当涉及到Java代理时,我会有点迷路...)

我已经搜索了一段时间,但只找到了这两个问题,它们集中在@transactional标记本身的继承上...这在本例中并不重要,我并不关心注释所有的DoSomething实现,而只是注释抽象方法

共有1个答案

边意
2023-03-14

ServiceImplone的实例是AbstractBaseService的实例。当您创建ServiceImplone的实例时,只创建了一个对象。并且它的mainprocess()方法调用它的doSomething()方法。

该调用不是从一个Spring bean到另一个Spring bean的调用,因此没有任何东西可以被拦截。

 类似资料:
  • 问题内容: 如何在C ++中创建一个抽象类,该抽象类具有一些我想在子类中重写的抽象方法?该文件应如何显示?是否有一个,如果是的话,应该看起来如何? 在Java中,它看起来像这样: 对于我来说,将此代码转换为C ++就足够了。 编辑: 我创建了代码,但是当我尝试遍历对象时,出现以下错误: 使用此代码: 问题答案: 在Java中,除非您声明了所有方法,否则默认情况下所有方法都是默认方法。在C ++中,

  • 问题内容: 我接受了一次采访,面试官首先问我抽象类与所有抽象方法和接口之间的区别是什么。 我回答说,如果将来需要继承某些东西,并且已经扩展了一个类,那么您将无法做到这一点。 然后,他说,在这种情况下,您将永远不必扩展任何其他课程,而您必须执行合同。在这种情况下,最好使用抽象类或接口? 我告诉他您可以使用其中任何一个,但他并不满意。我不明白为什么-我认为这是开发人员/设计的选择。 问题答案: 表示接

  • 问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),

  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?