AOP - @Pointcut语法:如何使用超类参数/参数

时间:2016-09-20 23:45:13

标签: aop aspectj spring-aop

我正在使用Spring FrameworkAspectJ版本1.8.9

我有很多服务类,让我们考虑一下

  • CustomerServiceImpl
  • InvoiceServiceImpl
  • CarServiceImpl

关键是,每个人都有一个saveOne方法。因此

  • saveOne(客户客户)
  • saveOne(发票发票)
  • 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){

有效。直到这里为了更好地理解:

  • 第一个参数表示要保留的实体(在这种情况下为Car
  • 第二个参数表示对象或目标(XServiceImpl)已被“拦截”

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

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

@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,但仅适用于没有参数的方法

1 个答案:

答案 0 :(得分:2)

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

@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){

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