[英]AspectJ on children objects
我開始使用 AspectJ,我正在嘗試做一些我不知道是否可行的事情。 這是我的代碼:
public abstract class MyAbstractObject<T> {
private T myOtherObject;
public T getMyOtherObject() {
return myOtherObject;
}
}
@Component
public class MyObject extends MyAbstractObject<WhateverObject> {
}
@Aspect
@Component
public class MyAspects {
@Before("execution(* mypackage.MyAbstractObject.getMyOtherObject().set*(*))")
public void beforeExample(JoinPoint joinPoint) {
// DO THINGS
}
}
此代碼失敗,出現錯誤:
Caused by: java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting ')' at character position 58 execution(* mypackage.MyAbstractObject.getMyOtherObject().set*(*))
但是,我可以像這樣攔截 MyOtherObject,但不是它的設置器:
@Aspect
@Component
public class MyAspects {
@Before("execution(* mypackage.MyAbstractObject.getMyOtherObject())")
public void beforeExample(JoinPoint joinPoint) {
// DO THINGS
}
}
我不想到處攔截object MyOtherObject的setter,因為這個object在程序中更多的地方用到了我不需要的方面。 但是,我只想在擴展 MyAbstractObject 的 class 中使用時攔截它們。
我在 AspectJ 中使用 Spring。
謝謝。
不幸的是,您剛剛發明的語法是非法的。 您無法按照您夢想的方式來描述鏈式方法調用。
您真正想要的是攔截WhateverObject
類型的方法執行,而不是MyAbstractObject
或MyObject
的方法執行。 即,您的切入點應該下注
execution(* mypackage.WhateverObject.set*(*))
我只是在猜測,但是如果你想限制匹配以控制從getMyOtherObject()
調用(直接或間接)setter 方法的流程,在 AspectJ 中你會添加類似
&& cflow(execution(* mypackage.MyAbstractObject.getMyOtherObject()))
到第一個切入點。 但是cflow
切入點在 Spring AOP 中不可用,您似乎正在使用它。 所以
作為一個通常不使用 Spring 的本地 AspectJ 粉絲,您可以想象我會推薦哪個選項來控制流切入點,但我認為您可以做出自己的決定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.