Spring AOP против AspectJ

У меня сложилось впечатление, что Spring AOP лучше всего использовать для конкретных задач приложения, таких как безопасность, ведение журнала, транзакции и т. Д., Поскольку он использует пользовательские аннотации Java5 в качестве основы. Однако AspectJ кажется более дружелюбным с точки зрения шаблонов проектирования.

Может ли кто-нибудь выделить различные плюсы и минусы использования Spring AOP и AspectJ в приложении Spring?


person Community    schedule 22.10.2009    source источник
comment
Если какая-то аннотация существует в Spring, но также существует в Java, что вам следует использовать? Джава. Та же логика применима к этой функции. Весна есть Весна. вот сегодня ушел завтра. (Помните, люди использовали Struts незадолго до весны). AspectJ - предпочтительное долгосрочное решение. Он переживет весну. Я не пренебрегаю Spring, просто говорю, для этого аспекта ...: -;   -  person inor    schedule 25.01.2018


Ответы (8)


Плюсы Spring-AOP

  • Его проще использовать, чем AspectJ, поскольку вам не нужно использовать LTW (ткачество во время загрузки) или компилятор AspectJ.

  • Он использует шаблон прокси и шаблон декоратора.

Spring-AOP Минусы

  • Это АОП на основе прокси, поэтому в основном вы можете использовать только точки соединения выполнения метода.
  • Аспекты не применяются при вызове другого метода в том же классе.
  • Могут быть небольшие накладные расходы во время выполнения.
  • Spring-AOP не может добавить аспект ко всему, что не создано фабрикой Spring.

AspectJ Плюсы

  • Это поддерживает все точки соединения. Это означает, что вы можете делать все, что угодно.
  • Затраты времени выполнения меньше, чем у Spring AOP.

AspectJ Минусы

  • Будь осторожен. Проверьте, вплетены ли ваши аспекты только в то, что вы хотели соткать.
  • Вам нужен дополнительный процесс сборки с помощью AspectJ Compiler или необходимо настроить LTW (ткачество во время загрузки)
person Community    schedule 22.10.2009
comment
@Configurable требует использования AspecJ через Spring. Из документов: If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ. - person HDave; 13.08.2013
comment
Еще один недостаток Spring-Aop для меня - это нечитаемые длинные трассировки стека из-за подхода на основе прокси - person wrm; 23.08.2013
comment
Непонятная часть ответа: почему небольшие накладные расходы времени выполнения являются профи для одного инструмента, а возможность небольших накладных расходов времени выполнения - недостатком для другого? - person Moreaki; 02.06.2015
comment
@Moreaki: Он сказал «немного накладных расходов» в качестве мошенничества и «немного накладных расходов» в качестве профи. Единственная разница в «а» очень важна - на английском языке «немного» означает «немного», тогда как «мало» означает «почти нет». - person wujek; 25.07.2015
comment
Просто небольшое сомнение - в ваших Spring AOP Pros (2-й пункт) - если мы будем использовать аннотацию @Aspect весной, это будет аспектJ AOP, просто интересно, будет ли он использовать прокси (время выполнения) или байтовую модификацию (компилировать время). Потому что у меня сложилось впечатление, что AspectJ - это время компиляции, а Spring AOP - это время выполнения AOP. Пожалуйста, помогите - person Pedantic; 12.06.2016
comment
Будь осторожен. это не афера. - person Koray Tugay; 26.10.2017
comment
На самом деле недостаток осторожности - это всего лишь краткий совет о том, что с помощью аспектаJ вы можете легко применить аспект в классах, которых вы не ожидали. - person Patrick Cornelissen; 29.10.2017
comment
@Pedantic Это все равно будет прокси. - person Koray Tugay; 25.11.2017
comment
Как использование шаблона Proxy и Decorator является преимуществом для Spring-AOP? Вы даже отбрасываете это в минусы. Я бы удалил это из профи для Spring-AOP, поскольку на самом деле это недостаток. - person Knack; 27.03.2018
comment
Будь осторожен. Проверьте, вплетены ли ваши аспекты только в то, что вы хотели соткать. Полагаю, это касается точечных сокращений? Это также относится к Spring-AOP. - person Knack; 27.03.2018

Дополнительное примечание: Если важна производительность при высокой нагрузке, вам понадобится AspectJ, который в 9–35 раз быстрее, чем Spring AOP. 10 нс против 355 нс может показаться не таким уж большим, но я видел людей, использующих МНОГО аспектов. 10 тысяч аспектов. В этих случаях ваш запрос может затронуть тысячи аспектов. В этом случае вы добавляете мс к этому запросу.

См. тесты производительности.

person Community    schedule 16.02.2014
comment
Контрольные показатели в https://web.archive.org/web/20150520175004/https://docs.codehaus.org/display/AW/AOP+Benchmark - person Ian; 31.10.2016

Помимо того, что заявили другие - просто перефразируя, there are two major differences:

  1. Один связан с типом плетения.
  2. Другой к определению точки соединения.

Spring-AOP: переплетение среды выполнения через прокси с использованием концепции dynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: переплетение времени компиляции через AspectJ Java Tools(ajc compiler), если доступен источник, или переплетение после компиляции (с использованием скомпилированных файлов). Кроме того, можно включить изменение времени загрузки с помощью Spring - для этого требуется файл определения aspectj и он обеспечивает гибкость.

Ткачество времени компиляции может предложить преимущества производительности (в некоторых случаях), а также joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

person Community    schedule 30.10.2009

Руководство пользователя Spring предоставит много информации, прямо изо рта лошади.

Глава 6.4 - Выбор стиля объявления AOP для использования неуместен для вас, поскольку в нем обсуждаются плюсы и минусы обоих.

Абзац 6.1.2 - Spring Возможности и цели АОП и главы 6.2 - поддержка @Aspect и 6.8. Использование AspectJ с приложениями Spring должно быть особенно интересным.

person Community    schedule 29.10.2009

Пружинный АОП - одна из важнейших частей пружинного каркаса. На самом базовом этапе Spring framework основан на IoC и AOP. В официальном курсе Spring есть слайд, на котором говорится:

АОП - одна из самых важных частей фреймворка.

Ключевым моментом для понимания того, как работает АОП в Spring, является то, что когда вы пишете аспект с помощью Spring, мы инструментируем фреймворк построением прокси для ваших объектов с помощью JDKDynamicProxy, если ваш компонент реализует интерфейс, или через CGLIB, если ваш компонент не реализует любой интерфейс. Помните, что у вас должен быть cglib 2.2 в вашем пути к классу, если вы используете Spring до версии 3.2. Начиная с Spring 3.2 он бесполезен, потому что cglib 2.2 был включен в ядро.

Фреймворк при создании bean-компонента создаст прокси, который обертывает ваши объекты и добавляет сквозные обязанности, такие как безопасность, управление транзакциями, ведение журнала и т. Д.

Создание прокси таким образом будет применяться, начиная с выражения pointcut, которое инструментирует структуру, чтобы решить, какие bean-компоненты и методы будут созданы в качестве прокси. За советом будет больше ответственности, чем за ваш код. Помните, что в этом процессе pointcut захватывает только общедоступные методы, которые не объявлены как final.

Теперь, в то время как в Spring AOP создание аспектов будет выполняться контейнером при запуске контейнера, в AspectJ вы должны выполнить это с последующей компиляцией вашего кода посредством модификации байт-кода. По этой причине, на мой взгляд, подход Spring проще и управляемее, чем AspectJ.

С другой стороны, с Spring AOP вы не можете использовать всю мощь АОП, потому что реализация осуществляется через прокси, а не путем модификации вашего кода.

Как и в AspectJ, в SpringAOP можно использовать ткачество во время загрузки. Вы можете воспользоваться этой функцией, которая будет реализована в Spring с помощью агента и специальных конфигураций, @EnabledLoadWeaving или в XML. Вы можете использовать пространство имен в качестве примера. Однако в Spring AOP вы не можете перехватить все случаи. Например, команда new не поддерживается в Spring AOP.

Однако в Spring AOP вы можете извлечь выгоду из использования AspectJ за счет использования фабричного метода aspectof в компоненте конфигурации Spring.

По той причине, что Spring AOP - это в основном прокси, созданный из контейнера, поэтому вы можете использовать AOP только для Spring beans. В то время как с AspectJ вы можете использовать аспект во всех ваших bean-компонентах. Еще один момент для сравнения - отладка и предсказуемость поведения кода. В Spring AOP все задания выполняются компилятором Java, и аспекты - это очень крутой способ создания прокси для вашего компонента Spring. В AspectJ, если вы изменяете код, вам нужно больше компилировать, и понять, где сплетены ваши аспекты, может быть сложно. Даже выключение плетения весной проще: с пружиной вы удаляете аспект из своей конфигурации, перезапускаете, и он работает. В AspectJ вы должны перекомпилировать код!

В ткачестве во время загрузки AspectJ более гибок, чем Spring, потому что Spring не поддерживает все параметры AspectJ. Но, на мой взгляд, если вы хотите изменить процесс создания bean-компонента, лучший способ - управлять пользовательским входом в систему на фабрике, а не с изменением во время загрузки аспекта, который изменяет поведение вашего нового оператора.

Я надеюсь, что этот обзор AspectJ и Spring AOP поможет вам понять разницу между двумя зелиями.

person Community    schedule 10.03.2016

В этой статье также есть хорошее объяснение по теме.

Spring AOP и AspectJ преследуют разные цели.

Spring AOP стремится предоставить простую реализацию АОП в Spring IoC для решения наиболее распространенных проблем, с которыми сталкиваются программисты.

С другой стороны, AspectJ - это оригинальная технология АОП, целью которой является предоставление полного решения АОП.

person Community    schedule 28.01.2019

Важно учитывать, будут ли ваши аспекты критически важными и где будет разворачиваться ваш код. Spring AOP будет означать, что вы полагаетесь на ткачество во время загрузки. Это может не сработать, и по моему опыту это означает, что могут существовать зарегистрированные ошибки, но это не помешает запуску приложения без кода аспекта [Я бы добавил предостережение, что его можно настроить таким образом, чтобы это это не так; но лично мне об этом не известно]. Плетение во время компиляции избегает этого.

Кроме того, если вы используете AspectJ в сочетании с подключаемым модулем Aspectj-maven-plugin, вы можете запускать модульные тесты для ваших аспектов в среде CI и быть уверенным, что построенные артефакты протестированы и правильно сплетены. Хотя вы, безусловно, можете писать модульные тесты, управляемые Spring, у вас все еще нет гарантии, что развернутый код будет тем, который был протестирован в случае сбоя LTW.

Еще одно соображение заключается в том, размещаете ли вы приложение в среде, где вы можете напрямую отслеживать успешность или неудачу запуска сервера / приложения, или ваше приложение развертывается в среде, где оно не находится под вашим контролем [например, где он размещен у клиента]. Опять же, это укажет путь к компиляции ткачества времени.

Пять лет назад я был более склонен к настройке АОП Spring по той простой причине, что с ним было легче работать и меньше шансов проглотить мою IDE. Однако по мере увеличения вычислительной мощности и доступной памяти это стало гораздо менее серьезной проблемой, и CTW с аспектомj-maven-plugin стал лучшим выбором в моей рабочей среде по причинам, которые я изложил выше.

person Community    schedule 25.01.2018

По сравнению с АОП, AspectJ не нужно улучшать целевой класс во время компиляции. Вместо этого он генерирует прокси-класс для целевого класса во время выполнения, который либо реализует тот же интерфейс, что и целевой класс, либо является подклассом целевого класса.

Таким образом, экземпляр прокси-класса может быть используется как экземпляр целевого класса. В целом, среда АОП, улучшенная во время компиляции, более выгодна с точки зрения производительности, потому что среда АОП, расширенная во время выполнения, требует динамических улучшений при каждом запуске.

person Community    schedule 21.10.2019