Ответ
Перехватчик (Interceptor) — это компонент, который перехватывает выполнение вызова метода или обработку запроса/ответа для добавления сквозной (cross-cutting) функциональности без модификации основного бизнес-кода.
Основные цели использования:
- Логирование вызовов методов и параметров.
- Транзакционность (открытие/закрытие транзакций).
- Безопасность (проверка прав доступа).
- Кеширование результатов.
- Валидация входных данных.
- Измерение производительности.
Реализации в Java-экосистеме:
-
Spring AOP (Aspect-Oriented Programming):
@Aspect @Component public class LoggingInterceptor { @Around("execution(* com.example.service.*.*(..))") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); Object result = joinPoint.proceed(); // Продолжение выполнения целевого метода long elapsedTime = System.currentTimeMillis() - start; System.out.println(joinPoint.getSignature() + " executed in " + elapsedTime + "ms"); return result; } } -
Jakarta EE / JAX-RS (для REST):
@Provider public class AuthInterceptor implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { // Проверка заголовка Authorization перед вызовом REST-метода String authHeader = requestContext.getHeaderString("Authorization"); if (!isValid(authHeader)) { requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); } } } -
Самописные реализации на основе паттернов Декоратор (Decorator) или Динамический прокси (Dynamic Proxy).
Принцип работы: Перехватчик встраивается в цепочку вызовов (interceptor chain). Он может выполнить код до (@Before), после (@After) или вокруг (@Around) вызова целевого объекта, а также модифицировать передаваемые аргументы или возвращаемый результат.