Понятия 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