Карта / Spring AOP / Зачем AOP

Зачем AOP

AOP (Aspect-Oriented Programming) — способ вынести сквозную логику (логирование, проверка прав, замер времени), которая иначе дублировалась бы в каждом методе, в одно место.

// ❌ без AOP — логирование дублируется в каждом методе
class UserService {
    User getUser(Long id) {
        log.info("Вызван getUser с id={}", id);
        long start = System.currentTimeMillis();
        User user = repo.findById(id);
        log.info("getUser выполнен за {}мс", System.currentTimeMillis() - start);
        return user;
    }
    User createUser(User user) {
        log.info("Вызван createUser");          // дублирование той же идеи
        long start = System.currentTimeMillis();
        // ...
    }
}

С AOP эта “обвязка” пишется один раз, отдельно от бизнес-логики, и автоматически применяется ко всем нужным методам — методы остаются чистыми, без повторяющегося кода замера времени и логирования.

Копнуть глубже

Сквозная логика (cross-cutting concerns) — функциональность, которая “пронизывает” много разных, не связанных между собой частей системы: логирование, безопасность, транзакции, кэширование, метрики. Каждая из них не относится к бизнес-логике конкретного метода, но нужна почти везде.

@Transactional и @Cacheable — уже знакомые примеры AOP, реализованные через Proxy (см. тему «Как работают прокси»). AOP — это общий принцип, на котором они построены, просто Spring даёт готовые аннотации для самых частых случаев. Для своей сквозной логики (например, измерение времени выполнения для всех методов сервисного слоя) можно написать собственный аспект — подробнее в теме «Aspect, Advice, Pointcut».

🎤 Закрыл тему, если можешь объяснить:
• какую проблему решает AOP на примере дублирующегося логирования;
• что такое сквозная логика и какие знакомые аннотации построены на AOP (если дошёл до 2-го слоя).