Продолжаем отвечать на популярные вопросы о фреймворке.
AOP используется Spring с начала существования. Но несмотря на это, мало кто может просто и правильно объяснить в чем разница между использованием Spring AOP и AspectJ, а также перечислить возможные варианты их использования. Попробуем разобраться вместе.
Начнем с определения понятий.
AOP - аспектно-ориентированное программирование, парадигма предназначенная для того, чтобы отделить, так называемую, cross-cutting функциональность от основного кода приложения, сгруппировав ее в одном месте. Основными составными частями AOP являются:
- Join point - место где мы вызываем наш специфический код.
- Pointcut - совокупность join point.
- Advice - собственно код нашей функциональности, который мы будем вызывать.
- Aspect - совокупность второго и третьего.
Далее, рассмотрим, что такое Spring AOP.
Это реализация AOP, специально разработанная для использования Spring. Она оперирует только только с method execution join points. В случае работы с интерфейсными типами, Spring AOP использует J2SE dynamic proxies, в противном случае с классами используется библиотека CGLIB. Документация тут.
Идем дальше - стили AOP.
@AspectJ это стиль объявления аспектов, как Java классов, с использованием аннотаций, разработанный проектом AspectJ. Spring поддерживает эти аннотации (объявление аспекта, декларация pointcut) и автоматически проксирует те бины, к которым будут применены аспекты. Прошу заметить что тут по прежнему используется ТОЛЬКО механизмы Spring AOP и не присутствуют зависимости от AspectJ compiler и weaver.
Spring имеет namespace для работы с AOP. Для начала работы (чтоб Spring сам искал в контексте компоненты, которые являются аспектами, то есть имеют @Aspect) требуется объявить:
Пример из нашего репозитория тут.
Документация тут.
Аналогичным образом можно использовать исключительно XML контекст для объявления и работы с аспектами. С использованием того же namespace, что и для @AspectJ style. Документауия ут.
Теперь немного больше про AspectJ.
AspectJ является имплементацией AOP для Java. Это самостоятельная технология не имеющая отношения к Spring кроме того, что фреймворк ее удачно использует. Как понятно из вышесказанного - можно использовать AOP на основе AspectJ без Spring. Она достаточно нетривиальна (как обычно Spring сделал ее для нас проще). В случае использования AspectJ вы можете либо использовать аннотации @AspectJ-style, либо язык AspectJ. Кто знаком со Spring Roo, тот обращал внимание, что там используются отдельные файлы ( .aj ) для хранения аспектов - это пример использования языка AspectJ.
Подробнее об AspectJ тут.
Теперь по выбору подхода в каждом конкретном случае.
Вы можете использовать Spring AOP как полностью XML конфигурацию, @AspectJ, с использованием языка AspectJ. Кроме того у вас есть возможность использовать непосредственно AspectJ (который тоже имеет варианты использования). В документации все очень неплохо описано. Рекомендую почитать тут. Если резюмировать для тех, кто не прошел по ссылке - чем проще - тем лучше. Если вам достаточно возможностей Spring AOP (ограничен poincut при вызове метода), используйте его. Причем dynamic proxies, конечно же, легковесней использования CGLIB. Аннотационный подход предпочтительней в любом из случаев.
Чего я не нашел в документации, так это подробного описание использования AspectJ ВМЕСТО Spring AOP. Документация ограничивается использованием @Configurable для расширения Spring контекста на бины ВНЕ контейнера. При этом используется Load Time Weaving (LTW). Кстати, пример использования этого подхода для интеграции Spring c Vaadin тут.
А вообще, тема интересная, так, что это только начало. Дальше - больше: использование @Cachable, Spring Data Graph, Spring for Andoid.
Всегда ваши me & eugene.
No comments:
Post a Comment