Spring AOP против AspectJ - PullRequest
       14

Spring AOP против AspectJ

165 голосов
/ 22 октября 2009

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

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

Ответы [ 7 ]

220 голосов
/ 22 октября 2009

Spring-AOP Pros

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

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

Spring-AOP Минусы

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

AspectJ Pros

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

AspectJ Минусы

  • Будь осторожен. Проверьте, связаны ли ваши аспекты только с тем, что вы хотели соткать.
  • Вам необходим дополнительный процесс сборки с AspectJ Compiler или необходимо настроить LTW (время загрузки)
21 голосов
/ 30 октября 2009

Помимо того, что говорили другие - просто перефразируя, 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.

18 голосов
/ 16 февраля 2014

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

См. тесты .

18 голосов
/ 29 октября 2009

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

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

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

12 голосов
/ 11 марта 2016

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

AOP является одной из наиболее важных частей фреймворка.

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 28 января 2019

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

Spring AOP и AspectJ имеют разные цели.

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

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

0 голосов
/ 26 января 2018

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

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

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

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

...