Разъяснение вокруг Spring-AOP точек и наследования
Учитывая следующие примеры классов в my.package
...
public class Foo {
public void logicNotInBar() {/*code*/}
public void logicBarOverrides() {/*code*/}
}
public class Bar extends Foo {
public void logicBarOverrides() {/*code*/}
}
и следующие Spring-AOP pointcuts...
<aop:pointcut id="myPointcutAll" expression="execution(* my.package.*.*(..))" />
<aop:pointcut id="myPointcutFoo" expression="execution(* my.package.Foo.*(..))" />
<aop:pointcut id="myPointcutBar" expression="execution(* my.package.Bar.*(..))" />
Каков результат рекомендации, примененной к вышеупомянутым pointcut в случаях Bar? Особенно...
Bar bar = new Bar();
bar.logicNotInBar(); // will myPointcutBar advice trigger?
bar.logicBarOverrides(); // is myPointcutFoo ignored here?
Я думаю, что упускаю некоторую основную истину о том, как pointcut взаимодействует с наследованием, поэтому объяснение / документация под капотом, вероятно, будет иметь большое значение.
1 ответ
При сопоставлении точек соединения выполнения метода, если в сигнатуре метода pointcut выполнения указан объявленный тип, pointcut будет соответствовать только методам, объявленным в этом типе, или методам, которые переопределяют методы, объявленные или унаследованные этим типом. Итак, pointcut
исполнение (публичное недействительное Middle.*())
выбирает все исполнения методов для открытых методов, возвращающих void и не имеющих аргументов, которые либо объявлены, либо унаследованы в Middle, даже если эти методы переопределены в подклассе Middle. Таким образом, pointcut выберет точку соединения метода-исполнения для Sub.m() в этом коде:
class Super {
protected void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
public void m() { ... }
}