AOP - @Pointcut 语法:如何使用超类定义方法 argument/parameter
AOP - @Pointcut syntax: how define the method with a superclass argument/parameter
我正在使用 Spring Framework
和 AspectJ
版本 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)已经'intercepted'
注意:我需要第一个参数用于审计和日志记录。因此它是强制性的。
为了避免冗长并为每个实体创建更多内容,我想使用 '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){
我用我的代码示例进行了尝试,它适用于所有类型的参数。
我正在使用 Spring Framework
和 AspectJ
版本 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)已经'intercepted'
注意:我需要第一个参数用于审计和日志记录。因此它是强制性的。
为了避免冗长并为每个实体创建更多内容,我想使用 '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){
我用我的代码示例进行了尝试,它适用于所有类型的参数。