Какие виды Pointcuts поддерживает Spring AOP


Spring AOP — это мощный фреймворк, который позволяет внедрять аспектно-ориентированное программирование в приложения на языке Java. Одним из ключевых понятий в Spring AOP является Pointcut — точка соединения кода, где мы можем внедрить наши аспекты.

Pointcuts в Spring AOP позволяют нам определить, где именно в коде мы хотим применять наши советы — куски кода, которые мы хотели бы выполнить до, после или вокруг определенных методов. Spring AOP поддерживает различные виды Pointcuts, чтобы обеспечить максимальную гибкость и контроль над аспектами в наших приложениях.

Вот полный список видов Pointcuts, поддерживаемых Spring AOP:

  • execution: позволяет определить точку соединения, используя сигнатуры методов, регулярные выражения или другие сравнительные выражения.
  • within: позволяет определить точку соединения внутри определенных пакетов, классов или интерфейсов.
  • args: позволяет определить точку соединения, основываясь на типах аргументов методов.
  • @target: позволяет определить точку соединения, основываясь на аннотации, примененной к целевому объекту.
  • @annotation: позволяет определить точку соединения, основываясь на аннотации, примененной к вызываемому методу.

Каждый вид Pointcuts имеет свои особенности и может быть использован в различных сценариях внедрения аспектов в приложения. Понимание различий между этими видами Pointcuts поможет нам достичь гибкости и эффективности в разработке наших приложений с использованием Spring AOP.

Виды Pointcuts

Spring AOP поддерживает различные виды Pointcuts, которые позволяют определить, где именно в коде необходимо применять советы (advices). Вот список этих видов:

1. Точечные выражения (Pointcut Expressions): позволяют указать конкретные точки в коде, где нужно применить аспекты.

2. Аннотации (Annotations): позволяют указать, что нужно применить советы к методам или классам, помеченным определенными аннотациями.

3. Имена пакетов (Package Names): позволяют указать, что нужно применить советы к классам, находящимся в определенных пакетах.

4. Имена классов (Class Names): позволяют указать, что нужно применить советы к определенным классам или их иерархии.

5. Модификаторы доступа (Access Modifiers): позволяют указать, что нужно применить советы только к методам с определенными модификаторами доступа, такими как public, private или protected.

6. Типы возвращаемых значений (Return Types): позволяют указать, что нужно применить советы только к методам, возвращающим определенный тип данных.

7. Имена методов (Method Names): позволяют указать, что нужно применить советы к определенным методам или их сигнатурам.

8. Аргументы методов (Method Arguments): позволяют указать, что нужно применить советы только к методам с определенными аргументами.

9. Точки выполнения (Join Points): позволяют указать, что нужно применить советы к определенным точкам выполнения в коде, например, к точкам вызова методов или создания объектов.

Каждый из этих видов Pointcuts имеет свои особенности и дает возможность более тонкой настройки применения аспектов в приложении с использованием Spring AOP.

Сопоставление по имени метода

Сопоставление по имени метода в Spring AOP позволяет выбрать методы, соответствующие заданному имени или шаблону имени.

Для сопоставления по имени метода в Spring AOP используется символ *, который обозначает любое количество символов в имени метода. Например, выражение execution(* com.example.*.get*()) сопоставит все методы, начинающиеся с префикса get, в любом классе в пакете com.example.

Также можно использовать точку с запятой для сопоставления с любым символом. Например, выражение execution(* *.*Value()) сопоставит все методы с суффиксом Value, включая методы, имя которых состоит только из символа Value.

Использование сопоставления по имени метода в Spring AOP позволяет гибко выбирать методы для перехвата и внедрения аспектов, основываясь на их именах.

Сопоставление по типу аргументов

Spring AOP также поддерживает возможность указывать сопоставление по типу аргументов метода. Это означает, что вы можете определить, что совпадение будет выполняться только для методов, у которых есть аргументы определенного типа.

Для этого можно использовать ключевое слово args и указать типы аргументов в круглых скобках. Например, следующая конфигурация сопоставит все методы, у которых есть один аргумент типа java.lang.String:

@Pointcut("args(java.lang.String)")public void stringArgument() {}

Теперь вы можете использовать это выражение в вашем совете или других аспектах. Например:

@Before("stringArgument()")public void beforeMethodWithSingleStringArgument() {// Выполняется перед методами с одним аргументом типа String}

Таким образом, сопоставление по типу аргументов позволяет более гибко определить, на какие методы будет применяться аспект Spring AOP.

Сопоставление по аннотации

Сопоставление по аннотации позволяет определить точку применения совета, основываясь на наличии определенной аннотации в коде. Spring AOP поддерживает следующие аннотации:

  • @Before: совет будет выполняться перед вызовом метода, помеченного указанной аннотацией.
  • @After: совет будет выполняться после вызова метода, помеченного указанной аннотацией.
  • @AfterReturning: совет будет выполняться после успешного возврата значения из метода, помеченного указанной аннотацией.
  • @AfterThrowing: совет будет выполняться после выброса исключения из метода, помеченного указанной аннотацией.
  • @Around: совет будет выполняться вокруг вызова метода, помеченного указанной аннотацией.

Для применения аннотаций в Spring AOP необходимо настроить соответствующий AspectJ-уровень поддержки аннотаций и указать аннотации в качестве параметров pointcut-выражений.

Сопоставление по модификатору доступа

Spring AOP поддерживает сопоставление с Pointcut по модификатору доступа методов. Это позволяет выбирать методы, основываясь на их видимости и доступности.

Список модификаторов доступа, которые можно использовать в Pointcut:

  • public — выбирает публичные методы, которые доступны из любого места программы;
  • private — выбирает приватные методы, которые доступны только внутри класса;
  • protected — выбирает защищенные методы, которые доступны внутри класса, его подклассов и классов в том же пакете;
  • default (пустой модификатор доступа) — выбирает методы с «пакетным» доступом, которые доступны только внутри класса и классов в том же пакете;
  • !private — выбирает все методы, кроме приватных;
  • !protected — выбирает все методы, кроме защищенных;
  • !default (пустой модификатор доступа) — выбирает все методы, кроме с «пакетным» доступом;

Пример использования Pointcut сопоставления по модификатору доступа:

@Pointcut("execution(public * com.example.service.*.*(..))")public void publicMethods() {}@Pointcut("execution(private * com.example.service.*.*(..))")public void privateMethods() {}@Pointcut("execution(!private * com.example.service.*.*(..))")public void nonPrivateMethods() {}

В приведенном примере, в первом Pointcut метод publicMethods() будет соответствовать только публичным методам в пакете com.example.service. Второй Pointcut privateMethods() выбирает только приватные методы. Третий Pointcut nonPrivateMethods() выбирает все методы, кроме приватных.

Сопоставление по иерархии классов

Spring AOP позволяет осуществлять сопоставление с точками присоединения на основе иерархии классов. При таком сопоставлении точкой присоединения могут быть все классы, являющиеся подклассами или реализующими определенный класс или интерфейс.

Для указания иерархического сопоставления классов можно использовать шаблоны. Шаблон может содержать полное имя класса или часть имени класса с символом «*». Например, шаблон «com.example.*» подходит всем классам, находящимся в пакете «com.example» и его подпакетах.

Также возможно использование нескольких шаблонов для сопоставления с разными классами. Например, можно указать два шаблона: «com.example.service.*» и «com.example.dao.*», чтобы сопоставиться со всеми классами, находящимися в пакетах «com.example.service» и «com.example.dao» и их подпакетах.

ШаблонОписание
com.example.*Сопоставляет все классы в пакете «com.example» и его подпакетах
com.example.controller.*Сопоставляет все классы в пакете «com.example.controller» и его подпакетах
com.example.service.*Сопоставляет все классы в пакете «com.example.service» и его подпакетах

Сопоставление по пакету

Spring AOP также поддерживает сопоставление по пакету. При использовании данного типа Pointcut, мы определяем пакеты, в которых должны находиться целевые классы или методы. То есть, все классы или методы, находящиеся в указанных пакетах, будут подвержены аспектам.

Для примера, рассмотрим следующий код:

@Before("execution(* com.example.service.*.*(..))")public void beforeAdvice(){System.out.println("Advice before method execution");}

Здесь мы используем выражение «execution», которое определяет сигнатуру метода, и указываем пакет «com.example.service.*». Таким образом, данный аспект будет применяться ко всем методам, находящимся в указанном пакете.

Сопоставление по пакету предоставляет гибкость в определении целевых методов или классов, которые должны быть аспектами. Таким образом, можно выбирать только определенные пакеты, чтобы применять аспекты к определенным частям приложения.

Добавить комментарий

Вам также может понравиться