AOP - @Pointcut 语法:如何使用超类定义方法 argument/parameter

AOP - @Pointcut syntax: how define the method with a superclass argument/parameter

我正在使用 Spring FrameworkAspectJ 版本 1.8.9

我有很多服务类,让我们举个例子

重点是,每个都有一个saveOne方法。因此

如果我使用以下内容:

@Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImpl.saveOne(Car, ..)) && args(entity) && target(object)")
public void saveOnePointcut(Car entity, Object object){}

@Before(value="ServicePointcut.saveOnePointcut(entity, object)")
public void beforeAdviceSaveOne(Car entity, Object object){

有效。直到这里才能更好地理解:

注意:我需要第一个参数用于审计和日志记录。因此它是强制性的。

为了避免冗长并为每个实体创建更多内容,我想使用 'superclass' 类型。我试过

@Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImpl.saveOne(Object, ..)) && args(entity) && target(object)")
public void saveOnePointcut(Object entity, Object object){}

@Before(value="ServicePointcut.saveOnePointcut(entity, object)")
public void beforeAdviceSaveOne(Object entity, Object object){

观察第一个参数现在是一个 Object 并且它不起作用。

如果可以完成这个要求,正确的语法是什么?

我读过 Clarification around Spring-AOP pointcuts and inheritance 但它仅适用于方法 没有 参数

您可以尝试使用 Object+ 而不是 Object+ 表示扩展目标 class 的所有 classes。所以您的方面代码将如下所示:

@Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImpl.saveOne(Object+, ..)) && args(entity) && target(object)")
public void saveOnePointcut(Object entity, Object object){}

@Before(value="ServicePointcut.saveOnePointcut(entity, object)")
public void beforeAdviceSaveOne(Object entity, Object object){

我用我的代码示例进行了尝试,它适用于所有类型的参数。