Что такое перехватчик (Interceptor) в Java и для чего он используется?

«Что такое перехватчик (Interceptor) в Java и для чего он используется?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Перехватчик (Interceptor) — это компонент, который перехватывает выполнение вызова метода или обработку запроса/ответа для добавления сквозной (cross-cutting) функциональности без модификации основного бизнес-кода.

Основные цели использования:

  • Логирование вызовов методов и параметров.
  • Транзакционность (открытие/закрытие транзакций).
  • Безопасность (проверка прав доступа).
  • Кеширование результатов.
  • Валидация входных данных.
  • Измерение производительности.

Реализации в Java-экосистеме:

  1. 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;
        }
    }
  2. 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());
            }
        }
    }
  3. Самописные реализации на основе паттернов Декоратор (Decorator) или Динамический прокси (Dynamic Proxy).

Принцип работы: Перехватчик встраивается в цепочку вызовов (interceptor chain). Он может выполнить код до (@Before), после (@After) или вокруг (@Around) вызова целевого объекта, а также модифицировать передаваемые аргументы или возвращаемый результат.