Пружинный АОП - одна из важнейших частей пружинного каркаса. На самом базовом этапе 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