Понятия Joinpoint, Pointcut, Advice
В AOP (аспектно-ориентированном программировании) три ключевых концепции — Joinpoint, Pointcut и Advice — определяют, как и где выполняется логика аспектов. Эти понятия позволяют чётко определить, где вставлять дополнительную функциональность, и упростить реализацию сквозных задач.
Joinpoint
Joinpoint — это конкретная точка в выполнении программы, где аспект может быть применён.
Примеры:
Вызов метода.
Выполнение метода.
Обработка исключений.
Примеры Joinpoint в Spring AOP
Spring поддерживает только Joinpoint, связанные с методами:
Вызов метода (method execution).
Перехват аргументов метода.
Обработка результата или исключения.
Пример:
Основные методы Joinpoint
getSignature(): возвращает информацию о вызываемом методе.
getArgs(): возвращает массив аргументов метода.
getTarget(): объект, на котором вызван метод.
getThis(): прокси-объект, созданный Spring AOP.
Пример использования:
Pointcut
Pointcut — это выражение, определяющее набор Joinpoint, к которым будет применяться аспект.
Pointcut помогает сосредоточить внимание только на нужных местах кода.
В Spring используются SpEL (Spring Expression Language) для создания срезов:
По классу и методам:
По пакетам:
По аннотациям:
Пример:
Advice
Advice — это дополнительная логика, которая выполняется в определённой точке выполнения программы (Joinpoint).
Advice описывает, что нужно выполнить.
Типы Advice в Spring
@Before: выполняется перед вызовом метода.
@After: выполняется после завершения метода (независимо от результата).
@AfterReturning: выполняется, если метод завершился успешно.
@AfterThrowing: выполняется при выбросе исключения.
@Around: оборачивает выполнение метода, позволяет контролировать его выполнение.
#Java #Training #Spring #AOP #Joinpoint #Pointcut #Advice
В AOP (аспектно-ориентированном программировании) три ключевых концепции — Joinpoint, Pointcut и Advice — определяют, как и где выполняется логика аспектов. Эти понятия позволяют чётко определить, где вставлять дополнительную функциональность, и упростить реализацию сквозных задач.
Joinpoint
Joinpoint — это конкретная точка в выполнении программы, где аспект может быть применён.
Примеры:
Вызов метода.
Выполнение метода.
Обработка исключений.
Примеры Joinpoint в Spring AOP
Spring поддерживает только Joinpoint, связанные с методами:
Вызов метода (method execution).
Перехват аргументов метода.
Обработка результата или исключения.
Пример:
@Before("execution(* com.example.service.UserService.*(..))")
public void logMethodCall(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature());
System.out.println("Arguments: " + Arrays.toString(joinPoint.getArgs()));
}
Основные методы Joinpoint
getSignature(): возвращает информацию о вызываемом методе.
getArgs(): возвращает массив аргументов метода.
getTarget(): объект, на котором вызван метод.
getThis(): прокси-объект, созданный Spring AOP.
Пример использования:
@After("execution(* com.example.service.UserService.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("Executed method: " + joinPoint.getSignature().getName());
}
Pointcut
Pointcut — это выражение, определяющее набор Joinpoint, к которым будет применяться аспект.
Pointcut помогает сосредоточить внимание только на нужных местах кода.
В Spring используются SpEL (Spring Expression Language) для создания срезов:
По классу и методам:
execution(* com.example.service.UserService.*(..))
По пакетам:
execution(* com.example..*(..)) // Все методы во всех пакетах
По аннотациям:
@annotation(org.springframework.transaction.annotation.Transactional)
Пример:
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayerMethods() {}
Теперь serviceLayerMethods() можно использовать как ссылку на срез.
Advice
Advice — это дополнительная логика, которая выполняется в определённой точке выполнения программы (Joinpoint).
Advice описывает, что нужно выполнить.
Типы Advice в Spring
@Before: выполняется перед вызовом метода.
@Before("execution(* com.example.service.UserService.*(..))")
public void logBefore() {
System.out.println("Method is about to be called");
}
@After: выполняется после завершения метода (независимо от результата).
@After("execution(* com.example.service.UserService.*(..))")
public void logAfter() {
System.out.println("Method has been executed");
}
@AfterReturning: выполняется, если метод завершился успешно.
@AfterReturning(pointcut = "execution(* com.example.service.UserService.*(..))", returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned value: " + result);
}
@AfterThrowing: выполняется при выбросе исключения.
@AfterThrowing(pointcut = "execution(* com.example.service.UserService.*(..))", throwing = "exception")
public void logAfterThrowing(Exception exception) {
System.out.println("Exception thrown: " + exception.getMessage());
}
@Around: оборачивает выполнение метода, позволяет контролировать его выполнение.
@Around("execution(* com.example.service.UserService.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before method execution");
Object result = joinPoint.proceed();
System.out.println("After method execution");
return result;
}
#Java #Training #Spring #AOP #Joinpoint #Pointcut #Advice
Pointcut Expressions
Pointcut Expressions — это важный элемент AOP, позволяющий указать, где именно в коде должен срабатывать аспект. С их помощью можно точно определить, какие методы или классы будут подвержены сквозной функциональности.
1. Что такое Pointcut Expressions?
Pointcut — это выражение, определяющее набор точек соединения (Joinpoints), к которым будет применяться аспект. В Spring Pointcut Expressions основываются на синтаксисе AspectJ, что позволяет гибко описывать нужные методы или классы.
2. Основные типы Pointcut Expressions
execution:
Самый часто используемый тип, который указывает выполнение метода.
Все методы в классе UserService:
Методы, возвращающие void:
Методы с определённым набором параметров:
within:
Указывает на методы, принадлежащие определённому классу или пакету.
@annotation:
Указывает на методы, которые помечены определённой аннотацией.
args:
Указывает на методы, принимающие параметры определённого типа.
this / target:
this: срабатывает на прокси-объекты.
target: срабатывает на исходные объекты.
3. Комбинирование Pointcut Expressions
Pointcut выражения можно комбинировать с логическими операторами:
&& — И.
|| — ИЛИ.
! — НЕ.
Пример:
4. Использование Pointcut в аспектах
Определение Pointcut:
Применение к методам с аннотацией:
#Java #Training #Spring #AOP #Pointcut_Expressions
Pointcut Expressions — это важный элемент AOP, позволяющий указать, где именно в коде должен срабатывать аспект. С их помощью можно точно определить, какие методы или классы будут подвержены сквозной функциональности.
1. Что такое Pointcut Expressions?
Pointcut — это выражение, определяющее набор точек соединения (Joinpoints), к которым будет применяться аспект. В Spring Pointcut Expressions основываются на синтаксисе AspectJ, что позволяет гибко описывать нужные методы или классы.
2. Основные типы Pointcut Expressions
execution:
Самый часто используемый тип, который указывает выполнение метода.
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
Все методы в классе UserService:
execution(* com.example.service.UserService.*(..))
Методы, возвращающие void:
execution(void com.example.service.*.*(..))
Методы с определённым набором параметров:
execution(* com.example.service.UserService.findBy*(String, int))
within:
Указывает на методы, принадлежащие определённому классу или пакету.
within(com.example.service.UserService)
@annotation:
Указывает на методы, которые помечены определённой аннотацией.
@annotation(org.springframework.transaction.annotation.Transactional)
args:
Указывает на методы, принимающие параметры определённого типа.
args(java.lang.String, int)
this / target:
this: срабатывает на прокси-объекты.
target: срабатывает на исходные объекты.
this(com.example.service.UserService)
target(com.example.service.UserService)
3. Комбинирование Pointcut Expressions
Pointcut выражения можно комбинировать с логическими операторами:
&& — И.
|| — ИЛИ.
! — НЕ.
Пример:
@Pointcut("execution(* com.example.service.*.*(..)) && @annotation(org.springframework.transaction.annotation.Transactional)")
public void transactionalMethods() {}
4. Использование Pointcut в аспектах
Определение Pointcut:
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayerMethods() {}
@Before("serviceLayerMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
}
Применение к методам с аннотацией:
@Before("@annotation(com.example.annotations.Loggable)")
public void logForAnnotatedMethods(JoinPoint joinPoint) {
System.out.println("Logging for annotated method: " + joinPoint.getSignature().getName());
}
#Java #Training #Spring #AOP #Pointcut_Expressions