AOP-@切入点语法:如何使用超类参数/参数定义方法

AOP-@切入点语法:如何使用超类参数/参数定义方法,aop,aspectj,spring-aop,Aop,Aspectj,Spring Aop,我正在使用Spring框架和AspectJversion1.8.9 我有很多服务类,让我们考虑例如 CustomerServiceImpl InvoiceServiceImpl CarServiceImpl 关键是,每一个都有一个saveOne方法。所以 saveOne(客户) saveOne(发票) saveOne(汽车) 如果我使用以下选项: @Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImp

我正在使用
Spring框架
AspectJ
version
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+
,而不仅仅是
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){

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

谢谢!,它很好用。通常我在切入点的接口/类声明中看到了
+
,而不是在参数中。为什么不直接使用
*
而不是
对象+
?它基本上是等价的,不太冗长,更容易理解。
MyClass+
语法只有在您有一个特定的基类而不是
Object
时才应该使用。@kriegaex您是对的
*
Object+
更好,但是我做了一些研究,可以说在
参数(实体)的情况下,所有这些对AspectJ都没有意义
似乎最好的方法是执行(*com.manuel.jordan.service.impl.*serviceinpl.saveOne(..)&&args(实体)和target(对象)我不理解你的评论。为什么没有意义?正如我建议的那样。什么样的研究告诉你了?对不起,如果我的评论把你弄糊涂了。我只想说“execution(*com.manuel.jordan.service.impl.*serviceinpl.saveOne(Object+,…)&&args(entity)”和“execution(*com.manuel.jordan.service.impl.*serviceinpl.saveOne(…)&&args(entity)”产生相同的结果,所以第一个变量太多了