Весна АОП против этого AspectJ
У меня сложилось впечатление, что Spring AOP лучше всего использовать для конкретных задач приложения, таких как безопасность, ведение журнала, транзакции и т. д. поскольку он использует пользовательские аннотации Java5 в качестве основы. Тем не менее, AspectJ кажется более дружелюбным дизайном-образцами.
может ли кто-нибудь выделить различные плюсы и минусы использования Spring AOP vs AspectJ в приложении Spring?
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
:
- одно связано с типом соткать.
- другое определение 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 стал лучшим выбором в моей рабочей среде на основе причин, которые я изложил выше.