Весняний АОП - одна з найважливіших частин весняних рамок. На самому базовому етапі весняні рамки базуються на IoC та AOP. В офіційному курсі Весна є слайд, на якому написано:
AOP - одна з найважливіших частин основи.
Ключовим моментом для розуміння того, як працює AOP Spring, є те, що коли ви пишете Аспект з Spring, ми встановлюємо основу зі створення проксі-сервера для ваших об'єктів, JDKDynamicProxy
якщо a- bean реалізує інтерфейс або через CGLIB, якщо ваш bean не реалізує жодного інтерфейс. Пам'ятайте, що ви повинні мати cglib 2.2 у своєму класі-шляху, якщо ви використовуєте Spring до версії 3.2. Починаючи з весни 3.2, це марно, оскільки в основу було включено кліб 2.2.
Рамка при створенні bean створить проксі-сервер, який обгортає ваші об'єкти і додає наскрізних питань, пов'язаних з відповідальністю, такими як безпека, управління транзакціями, ведення журналів тощо.
Створення проксі-сервера таким чином буде застосовано, починаючи з точкового виразу, який інструментує рамки для вирішення того, які боби та методи будуть створені як проксі. Порада буде більшою відповідальністю, ніж за ваш код. Пам’ятайте, що в цьому процесі пунктир фіксує лише публічні методи, які не оголошуються як остаточні.
Тепер, поки у Spring AOP плетіння аспектів буде виконуватися контейнером при запуску контейнера, в AspectJ вам доведеться виконати це з подальшим складанням вашого коду шляхом зміни байт-коду. З цієї причини, на мій погляд, підхід Spring є більш простим і керованим, ніж AspectJ.
З іншого боку, за допомогою Spring AOP ви не можете використовувати всю потужність AOP, оскільки реалізація здійснюється через проксі, а не за допомогою зміни вашого коду.
Як і в AspectJ, у SpringAOP можна використовувати плетіння часу. Ви можете скористатися цією функцією навесні, реалізованої за допомогою агента та спеціальних конфігурацій, @EnabledLoadWeaving
або в XML. Ви можете використовувати простір імен як приклад. Однак у Spring AOP ви не можете перехопити всі справи. Наприклад, new
команда не підтримується у Spring AOP.
Однак у Spring AOP ви можете скористатися використанням AspectJ завдяки використанню aspectof
фабричного методу в пружинній конфігурації.
З тієї причини, що Spring AOP - це в основному проксі, створений з контейнера, тому ви можете використовувати AOP лише для весняних бобів. У той час як з AspectJ ви можете використовувати цей аспект у всіх своїх зернах. Іншим моментом порівняння є налагодження та передбачуваність поведінки коду. Завдяки Spring AOP ця робота попередньо формується з компілятора Java, і аспекти є дуже класним способом створення проксі для вашого Spring Bean. Якщо ви модифікуєте код AspectJ, вам потрібно більше компілювати, і зрозуміти, де ваші аспекти сплетені, може бути важко. Навіть вимкнення плетіння навесні простіше: весною ви видалите аспект зі своєї конфігурації, перезапустіть і воно працює. В AspectJ ви повинні перекомпілювати код!
У плетінні часу навантаження, AspectJ є більш гнучким, ніж весна, тому що Spring не підтримує всі параметри AspectJ. Але, на мою думку, якщо ви хочете змінити процес створення квасолі, кращим способом є керування користувальницьким входом на фабрику, а не за допомогою плетіння часу, який змінює поведінку вашого нового оператора.
Я сподіваюся, що ця панорама на AspectJ та Spring AOP допоможе вам зрозуміти різницю двох зілля