Разъяснение вокруг 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() { ... }
  }
Другие вопросы по тегам