Весна АОП против этого AspectJ


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

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

6 147

6 ответов:

Spring-AOP Pros

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

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

Весна-АОП минусы

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

AspectJ Pros

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

В AspectJ Минусы

  • будьте осторожны. Проверьте, если ваши аспекты сотканы только к тому, что ты хотел соткать.
  • вам нужен дополнительный процесс сборки с компилятором AspectJ или нужно настроить LTW (load-time weaving)

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

  1. одно связано с типом соткать.
  2. другое определение joinpoint.

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

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

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

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

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

в пункте 6.1.2-Spring AOP Capabilites and goals & главах 6.2 - @поддержка аспект и 6.8-использование AspectJ с пружинными приложениями должно быть особенно интересно.

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

посмотреть критерии.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

пять лет назад я был гораздо больше в пользу весеннего настроенного АОП по той простой причине, что с ним было легче работать и реже жевать мой ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ. Однако, поскольку вычислительная мощность и доступная память увеличились, это стало намного меньше проблем, и CTW с AspectJ-maven-plugin стал лучшим выбором в моей рабочей среде на основе причин, которые я изложил выше.