Какой фреймворк используется для написания кросс-секции
Что проверяют
За неудачным переводом «кросс-секция» стоят cross-cutting concerns, то есть сквозная функциональность: логирование, транзакции, безопасность, метрики. Проверяют знание AOP и того, как оно устроено в Spring. Следом почти всегда спрашивают, почему аспект не срабатывает при вызове метода из того же класса.
Как отвечать
Назовите два инструмента и разницу между ними:
- Spring AOP: работает через прокси. Для бина создаётся обёртка, JDK dynamic proxy по интерфейсу или подкласс через CGLIB, и советы выполняются, когда метод вызывают через эту обёртку. Перехватываются только методы бинов Spring при вызове снаружи, приватные и
finalметоды недоступны; - AspectJ: полноценный AOP с вплетением в байткод при компиляции или загрузке класса. Перехватывает конструкторы, доступ к полям, приватные методы и внутренние вызовы, но усложняет сборку.
Покажите, что знаете термины. Join point это точка выполнения программы, pointcut это выражение, которое такие точки выбирает (execution(* com.example.service..*(..)) или @annotation(com.example.Audited)), advice это код, выполняемый в выбранной точке. Виды советов: @Before, @AfterReturning, @AfterThrowing, @After и @Around, где вы сами вызываете ProceedingJoinPoint.proceed() и можете замерить время или подменить результат. Класс аспекта помечается @Aspect и регистрируется как бин.
Хорошо упомянуть, что на прокси Spring уже построены @Transactional, @Cacheable, @Async и @PreAuthorize, поэтому AOP вы используете каждый день, даже не написав ни одного аспекта. А для сквозной логики на уровне HTTP часто хватает фильтра сервлета или HandlerInterceptor.
Где спотыкаются
Не знают про самовызов. Метод, который вызывает соседний метод того же класса с @Transactional, идёт мимо прокси, и транзакция не открывается.
Путают термины: называют @Before точкой соединения, хотя это вид совета, а точки выбирает pointcut.
Уносят в аспекты бизнес-логику. Поведение, которого не видно в коде метода, тяжело отлаживать, поэтому аспекты оставляют для действительно сквозных задач.