Spring AOP jest jedną z podstawowych części ramy sprężynowej. Na bardzo podstawowym etapie ramy wiosenne są oparte na IoC i AOP. W oficjalnym przebiegu wiosny jest slajd, na którym jest napisane:
AOP jest jedną z najważniejszych części frameworka.
Kluczową kwestią do zrozumienia, jak działa AOP w Spring, jest to, że pisząc Aspect za pomocą Spring, oprzyrządujemy framework, budując proxy dla twoich obiektów, z JDKDynamicProxy
jeśli twój bean implementuje interfejs lub przez CGLIB, jeśli twój bean nie implementuje żadnego berło. Pamiętaj, że musisz mieć cglib 2.2 w swojej ścieżce klas, jeśli używasz Springa przed wersją 3.2. Począwszy od Spring 3.2 jest bezużyteczny, ponieważ cglib 2.2 był zawarty w rdzeniu.
Struktura przy tworzeniu fasoli utworzy proxy, które otacza twoje obiekty i dodaje obowiązki związane z przekrojami, takie jak bezpieczeństwo, zarządzanie transakcjami, logowanie i tak dalej.
Tworzenie proxy w ten sposób zostanie zastosowane począwszy od wyrażenia pointcut, które instrumentuje strukturę do decydowania, jakie komponenty bean i metody zostaną utworzone jako proxy. Rada będzie bardziej odpowiedzialna niż za Twój kod. Pamiętaj, że w tym procesie punkt cięcia przechwytuje tylko metody publiczne, które nie są zadeklarowane jako ostateczne.
Teraz, podczas gdy w wiosennym AOP tkanie aspektów będzie wykonywane przez kontener podczas uruchamiania kontenera, w AspectJ musisz to zrobić z kompilacją kodu po modyfikacji kodu bajtowego. Z tego powodu moim zdaniem podejście Spring jest prostsze i łatwiejsze w zarządzaniu niż AspectJ.
Z drugiej strony, w Spring AOP nie możesz wykorzystać całej mocy AOP, ponieważ implementacja odbywa się przez proxy, a nie poprzez modyfikację twojego kodu.
Podobnie jak w AspectJ, w SpringAOP możesz użyć tkania w czasie ładowania. Możesz skorzystać z tej funkcji wiosną jest zaimplementowana z agentem i specjalnymi konfiguracjami @EnabledLoadWeaving
lub w formacie XML. Możesz użyć przestrzeni nazw jako przykładu. Jednak w Spring AOP nie można przechwycić wszystkich przypadków. Na przykład new
polecenie nie jest obsługiwane w Spring AOP.
Jednak w Spring AOP możesz skorzystać z AspectJ poprzez użycie aspectof
metody fabrycznej w fasoli konfiguracji sprężyn.
Z tego powodu Spring AOP jest w zasadzie proxy utworzonym z pojemnika, więc możesz używać AOP tylko dla wiosennych ziaren. Podczas gdy z AspectJ możesz używać aspektu we wszystkich swoich ziarnach. Kolejnym punktem porównania jest debugowanie i przewidywalność zachowania kodu. W przypadku Spring AOP zadanie jest wykonywane w całości z kompilatora Java, a aspekty są bardzo fajnym sposobem tworzenia proxy dla beana Spring. W AspectJ, jeśli modyfikujesz kod, potrzebujesz więcej kompilacji i zrozumienia, gdzie tkane są twoje aspekty, może być trudne. Nawet wyłączenie tkania wiosną jest prostsze: za pomocą sprężyny usuwasz aspekt z konfiguracji, restartujesz i działa. W AspectJ musisz przekompilować kod!
W tkaniu w czasie ładowania AspectJ jest bardziej elastyczny niż Spring, ponieważ Spring nie obsługuje wszystkich opcji AspectJ. Ale moim zdaniem, jeśli chcesz zmienić proces tworzenia fasoli, lepszym sposobem jest zarządzanie niestandardowym logowaniem w fabryce, a nie tkanie w czasie ładowania aspektu, który zmienia zachowanie twojego nowego operatora.
Mam nadzieję, że ta panorama AspectJ i Spring AOP pomoże ci zrozumieć różnicę między tymi dwoma miksturami