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
version1.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)”产生相同的结果,所以第一个变量太多了