Spring 子类方法名的声明性事务语义

Spring declarative transaction semantics by method name of subclasses

我正在尝试根据 Spring 引导应用程序中的方法名称实现不同的事务语义。据我所知,我必须通过 XML 来执行此操作,如图 here 所示。这不理想,但很好。

我遇到的问题是在我的 BaseService 的子类上匹配所有 public 方法。我已经在完整的 AspectJ 中看到过这样的例子,但是在 Spring aop: stuff 它似乎不起作用。

<aop:config>
    <aop:pointcut id="services" expression="execution(public ppi.nestup.v3.service.BaseService+.*(..))"/>

    <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
</aop:config>

它不喜欢 aop:pointcut 表达式。错误是

java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 51 
execution(public ppi.nestup.v3.service.BaseService+.*(..)

如果有一种方法可以通过注释或 Java 配置来做到这一点,那会更好,但我不确定如何使用 AspectJ 切入点连接到 Spring 事务支持。

这是一个错字。应该是:

<aop:pointcut id="services" expression="execution(public ppi.nestup.v3.service.BaseService+ *(..))"/>

但它似乎仍然没有匹配任何方法

我建议您阅读 AspectJ 教程或 Spring AOP manual 以学习语法。

  • 问题中切入点的问题是您没有为要拦截的方法指定 return 类型。
  • 第二个问题是现在您正在尝试匹配所有 public 方法 returning(!) 一个 BaseService 实例。

您可能真正想要的是

execution(public * ppi.nestup.v3.service.BaseService+.*(..))

顺便说一句,你不需要使用 XML 配置,你可以通过 @Aspect@Pointcut@Before@Around 左右也是。