Что такое аспектно-ориентированное программирование и какие средства для него есть
Что проверяют
Понимаете ли вы, какую задачу решает подход, и знаете ли, как он реализован в Spring.
Как отвечать
Подход решает проблему сквозной функциональности: журналирование, измерение времени, транзакции, кэширование, проверка прав. Это вещи, нужные во многих местах, но не относящиеся к предметной логике. Без специального механизма они расползаются по всем методам и смешиваются с содержательным кодом.
Понятия:
- аспект: модуль, в который вынесена такая функциональность;
- точка соединения: место в программе, куда можно вмешаться. В Spring это вызов метода бина;
- срез: выражение, описывающее набор точек, например все методы с определённой аннотацией;
- совет: код, выполняемый в этих точках. Бывает до вызова, после, при исключении и оборачивающий вызов целиком.
Как это реализовано в Spring, и это главная часть ответа: через прокси. Контейнер оборачивает бин обёрткой, которая перехватывает вызовы. Обёртка создаётся динамически: через интерфейсы либо через наследование класса.
Из этого механизма прямо следуют ограничения, которые надо знать:
- самовызов не перехватывается. Метод, вызванный изнутри того же объекта, идёт напрямую, минуя обёртку, и аннотация молча не работает. Отсюда классическая проблема с транзакциями;
- приватные и финальные методы не перехватываются;
- работает только на бинах контейнера: объект, созданный оператором создания, обёртки не получит.
Средства: собственная поддержка Spring с аннотациями, а под ней библиотека AspectJ для разбора выражений срезов. Полноценный AspectJ со вплетением кода на этапе компиляции снимает все перечисленные ограничения, но требует отдельной настройки сборки и применяется редко.
Практический совет: аспекты мощны и потому опасны. Логика, спрятанная в невидимом месте, усложняет отладку, поэтому их держат для действительно сквозных вещей.
Где спотыкаются
Не знают про прокси и не могут объяснить проблему самовызова.
Ставят аннотацию на приватный метод.
Пишут аспекты для предметной логики.
Создают объект оператором создания и ждут, что аннотации сработают.