Spring AOP - одна из важнейших частей пружинного каркаса. На самом базовом этапе весенний каркас основан на IoC и АОП. В официальном курсе весны есть слайд, в котором говорится:
АОП является одной из важнейших частей каркаса.
Ключевой момент для понимания того, как AOP в Spring работает в том, что когда вы пишете аспект с весной мы инструмент рамка с построением прокси для ваших объектов, с JDKDynamicProxy
, если ваш компонент реализует интерфейс или через CGLIB если ваш компонент не реализует никакого интерфейса. Помните, что вы должны иметь cglib 2.2 в своем классе, если используете Spring до версии 3.2. Начиная с весны 3.2 это бесполезно, потому что cglib 2.2 был включен в ядро.
Рамка при создании бина создаст прокси-сервер, который будет обертывать ваши объекты и добавляет сквозные функции, такие как безопасность, управление транзакциями, ведение журнала и т. Д.
Создание прокси таким образом будет применяться, начиная с выражения pointcut, которое позволяет фреймворку определить, какие бобы и методы будут созданы как прокси. Совет будет больше ответственности, чем за ваш код. Помните, что в этом процессе pointcut захватывает только общедоступные методы, которые не объявляются окончательными.
Теперь, находясь в Spring AOP, плетение Аспектов будет выполняться контейнером при запуске контейнера, в AspectJ вы должны выполнить это с последующей компиляцией своего кода с помощью модификации байт-кода. По этой причине, на мой взгляд, подход Spring более прост и управляем, чем AspectJ.
С другой стороны, с Spring AOP вы не можете использовать всю мощность АОП, потому что реализация выполняется через прокси, а не с помощью модификации вашего кода.
Как и в AspectJ, вы можете использовать ткачество с нагрузкой в SpringAOP. Вы можете воспользоваться этой функцией весной, реализованной с помощью агента и специальных конфигураций, @EnabledLoadWeaving
или в формате XML. Вы можете использовать имя-пространство в качестве примера. Однако в Spring AOP вы не можете перехватить все случаи. Например, команда new
не поддерживается в Spring AOP.
Однако весной AOP вы можете воспользоваться использованием AspectJ с использованием заводского метода aspectof
в компоненте конфигурации пружины.
По той причине, что Spring AOP является в основном прокси-сервером, созданным из контейнера, поэтому вы можете использовать АОП только для весенних бобах. В то время как с AspectJ вы можете использовать этот аспект во всех своих компонентах. Еще одна точка сравнения - отладка и предсказуемость поведения кода. С Spring AOP задание готовится из компилятора Java, а аспекты - очень классный способ создания прокси-сервера для вашего Spring-компонента. В AspectJ, если вы изменяете код, вам нужно больше компиляции и понять, где ваши аспекты сплетены, может быть сложно. Даже закрытие ткачества весной проще: с пружиной вы удаляете аспект из своей конфигурации, перезапускайте и работаете. В AspectJ вы должны перекомпилировать код!
В процессе загрузки, AspectJ более гибкий, чем Spring, потому что Spring не поддерживает все опции AspectJ. Но, на мой взгляд, если вы хотите изменить процесс создания компонента, лучшим способом является управление пользовательским входом на заводе, а не с загрузкой времени, связанным с аспектом, который изменяет поведение вашего нового оператора.
Я надеюсь, что это панорамное из AspectJ и Spring AOP поможет вам понять разницу между двумя зелий
Когда какая-то аннотация существует весной, но также существует в Java, что вы должны использовать? Ява. Такая же логика применяется к этой функциональности. Весна - весна. здесь сегодня ушел завтра. (Помните, что люди использовали Struts некоторое время до весны). AspectJ является предпочтительным решением для долгосрочных сроков. Весна. Я не увольняю Весну, просто говорю, для этого аспекта ...:;; – inor