Разъяснение вокруг Spring-AOP и наследования - PullRequest
2 голосов
/ 11 октября 2011

Учитывая следующие примеры классов в my.package ...

public class Foo {
    public void logicNotInBar()     {/*code*/}
    public void logicBarOverrides() {/*code*/}
}

public class Bar extends Foo {
    public void logicBarOverrides() {/*code*/}
}

и следующие точки Spring-AOP ...

<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?

Я думаю, что мне не хватает какой-то основной истины о том, как pointcuts взаимодействуют с наследованием, поэтому объяснение / документация под капотом, вероятно, будет иметь большое значение.

1 Ответ

2 голосов
/ 12 октября 2011

Из аспекта документации :

При сопоставлении точек соединения метода-выполнения, если точка-точка выполнения сигнатура метода указывает декларирующий тип, 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() { ... }
  }
...