簡體   English   中英

子對象上的 AspectJ

[英]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類型的方法執行,而不是MyAbstractObjectMyObject的方法執行。 即,您的切入點應該下注

execution(* mypackage.WhateverObject.set*(*))

我只是在猜測,但是如果你想限制匹配以控制從getMyOtherObject()調用(直接或間接)setter 方法的流程,在 AspectJ 中你會添加類似

&& cflow(execution(* mypackage.MyAbstractObject.getMyOtherObject()))

到第一個切入點。 但是cflow切入點在 Spring AOP 中不可用,您似乎正在使用它。 所以

  • 要么切換到本機 AspectJ,它很容易集成到 Spring應用程序中,但也可以在 Spring 上下文之外使用,因為它是一個獨立的產品,
  • 或者您看看 Spring AOP 的“精簡版”控制流切入點是否滿足您的需要。 我張貼了一些答案和鏈接,在這里那里提到了這個幾乎沒有記錄的特性。

作為一個通常不使用 Spring 的本地 AspectJ 粉絲,您可以想象我會推薦哪個選項來控制流切入點,但我認為您可以做出自己的決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM