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

Using Spring transaction proxy between abstract class and child method

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

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 { ... }

如果 doSomething(foo) 出现问题,我想回滚对该对象所做的任何更改,将错误写入日志文件,然后继续处理列表中的下一个对象。因此,我将在我的基本服务的循环内添加一个 try-catch...并在实现 classes 中用 @Transactional 注释 doSomething 方法。但是根据 Spring's docs:

When you use proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. If you need to annotate non-public methods, consider using AspectJ (described later).

我的方法是 protected...我可以将可见性更改为 public,但还有一个问题是:

The default advice mode for processing @Transactional annotations is proxy, which allows for interception of calls through the proxy only. Local calls within the same class cannot get intercepted that way. For a more advanced mode of interception, consider switching to aspectj mode in combination with compile-time or load-time weaving.

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

我已经搜索了一段时间,但我只设法找到了这些 two questions,它们专注于 @Transactional 标签本身的继承......这不是真的在这种情况下很重要,我不关心注释所有 doSomething 实现而不仅仅是抽象方法。

ServiceImplOne 的实例是 AbstractBaseService 的实例。当您创建 ServiceImplOne 的实例时,会创建一个对象。它的 mainProcess() 方法调用它的 doSomething() 方法。

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