Pointcut для унаследованных методов с вызовами суперметода

У меня есть следующие классы

class A {
    public void someone() {
        helpMe();
    }
    private void helpMe() {
        // do something here
    }
}
class B extends A {
    public void help() {
        super.someone();
    }
}
class C extends A {
    public void me() {
        super.someone();
    }
}

Поэтому я хочу что-то делать каждый раз, когда вызывается метод helpMe. A.helpMe() никогда не вызывается явно. Все вызовы метода для A.helpMe() осуществляются через A.someone(), который далее вызывается через B.help() или C.me().

helpMe содержит общую реализацию, которая нужна любому другому классу.

точки, которые я пробовал

execution(* A.helpMe(..)) // does not work
execution(* A+.helpMe(..)) // does not work
execution(* *.helpMe(..)) // does not work

execution(* A.*(..)) // does not work
execution(* B.someone(..)) // does not work
execution(* A+.*(..)) // forms a point cut for B.help() and C.me() only
execution(* *.*(..)) // forms a point cut for B.help() and C.me() only
execution(* B.*(..)) // forms a point cut for B.help() only

Где-то читал, что pointcuts для super нельзя. Если это так, каковы некоторые допустимые обходные пути?

Я пытался получить pointcut с помощью annotations, но это тоже не работает.


person Nischit Pradhan    schedule 13.11.2019    source источник
comment
Spring AOP применяется через прокси, внутренние вызовы методов не могут быть перехвачены. Для этого вам понадобится полноценное АОП-решение, такое как AspectJ, с переплетением времени загрузки или компиляции.   -  person M. Deinum    schedule 13.11.2019


Ответы (1)


1 Если вы сомневаетесь, всегда возвращайтесь к полностью жестко закодированному pointcut и продолжайте снова:

execution(private void helpMe())

Вы уверены, что используете используя AspectJ, а не ванильный Spring AOP (который не может посоветовать частный метод)?


К сведению: https://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html

точка соединения call не фиксирует супервызовы нестатических методов

... что не относится к execution.

person drekbour    schedule 13.11.2019