Spring AOP против AspectJ

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

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

    6 Solutions collect form web for “Spring AOP против AspectJ”

    Весна-АОП Плюсы

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

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

    Spring-AOP Cons

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

    AspectJ Pros

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

    AspectJ Cons

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

    Помимо того, что другие заявили – просто перефразировать, 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) если источник доступен или после компиляции (используя скомпилированные файлы). Кроме того, можно включить загрузку времени со aspectj Spring – ему нужен aspectj определения aspectj и предлагает гибкость.

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

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

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

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

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

    См. Тесты .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Interesting Posts

    Ошибка запуска сервера MySql «Сервер завершает работу без обновления PID-файла»

    Резервные расширения, закладки и другие настройки из Google Chrome

    Отключить HTML-экранирование в шаблонах erb

    Как использовать «.» Как разделитель с String.split () в java

    Может ли жесткий диск> 2 ТБ (GPT) использоваться в качестве не загружаемого диска данных на плате, не имеющем UEFI?

    ggplot2 сохранить неиспользованные уровни barplot

    Составные первичные ключи в сравнении с уникальным полем идентификатора объекта

    didFinishPickingMediaWithInfo return nil фото

    Листинг файлов по времени последнего доступа?

    Как перемещать папки в другую папку в командной строке

    Несколько шлюзов по умолчанию

    Исключение с использованием CopyToDataTable с помощью «нового {..}» запроса LINQ

    Альтернатива gpedit.msc для выпусков Windows Home?

    Карта Java со значениями, ограниченными параметром типа ключа

    Как я могу запутать свой код c #, так что его нельзя легко деобфусить?

    Давайте будем гением компьютера.