SPRING-SOURCE.RU

Pointcut и Joint points

Где мы можем подсоединиться?

  1. Выполнение определенного метода:
    execution(void Point.setX(int))
  2. Вызов метода:
    call(void Point.setX(int))
  3. Выполнение обработчика прерывания:
    handler(ArrayOutOfBoundsException)
  4. Текущий объект принадлежит типу SomeType:
    this(SomeType)
  5. Целевой объект принадлежит типу SomeType:
    target(SomeType)
  6. Выполняемый код принадлежит классу MyClass:
    within(MyClass)
  7. Выполняемый код по стеку вызовов внутри метода:
    withincode(* MyClass.hello(..))
  1. Означает, что мы уже вошли внутрь метода, то есть параметры уже передались в метод. Параметры уже находятся в стеке.
  2. Значит, что в метод еще не вошли. Мы находимся в классе который будет вызывать метод. Параметры еще не передались.
  3. Вызвался метод, а метод выполнил exception.
  4. This – это текущий объект. Применяем, например, при вызове методов через интерфейса. Когда нахожусь внутри какого-то объекта.
  5. Target – это целевой объект.
  6. Значит, что текущий код находится внутри какого-то класса. Проверить, что какой-то другой aspect выполняется в классе. Если есть иерархия классов, а я хочу остановиться именно на этом.
  7. Есть один метод, он вызвал второй и вот этот второй может быть вызван из разных мест. Из этого, этого, этого… и когда я хочу прицепиться именно к тому первому методу, например.

Использование мета-символов

execution (* *(..))
// первая * - public или private, если *, значит все. Вторая *- название метода (..) – параметры, если .. то значит без разницы какие параметры

call (* set(..))

Выбор элементов в зависимости от типов

execution (int *()) // возвращаемое значение
call (* setY(long))
call (* Point.setY(int))
call (*.new(int, int)) // цепляюсь на конструктор (действие перед-после конструктора итд)
call ( (@Cache) * *(..) ) // зацепка на аннотации

Соединение pointcuts

target (Point) && call (int *()) // цепляется на все вызовы, которые возвращают int и если эти вызовы адресованы к Point
call (* *(..)) && (within (Line) || within (Point))
within (*) && execution (*.new(int))
!this (Point) && call (int *(..)) // прицепились на все вызовы методов, которые возвращают int, лишь бы вызовы не шли из класса Point

Использование области видимости методов

call (public * *(..))
execution (!static * *(..))
execution (public !static * *(..)) // все (public) кроме (!static)