Spring AOP vs AspectJ
Mam wrażenie, że Spring AOP najlepiej nadaje się do określonych zastosowań, takich jak bezpieczeństwo, rejestrowanie, transakcje itd., Ponieważ używa on niestandardowych adnotacji Java5 jako struktury. Jednak AspectJ wydaje się być bardziej przyjaznym wzorcem projektowym.
Czy ktoś może wskazać różne zalety i wady używania Spring AOP i AspectJ w aplikacji Spring?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
8 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Wady Spring-AOP
AspectJ plus
AspectJ cons
Anonimowy użytkownik
Potwierdzenie od:
Spring-AOP:
środowisko uruchomieniowe przeplatania przez proxy przy użyciu koncepcji
AspectJ:
tkanie w czasie kompilacji za pomocą , jeśli źródło jest dostępne lub splatanie po kompilacji (przy użyciu skompilowanych plików). Możliwe jest również włączenie czasu rozruchu w Spring - wymaga to pliku definicji i zapewnia elastyczność.
Tkanie w czasie kompilacji może oferować korzyści w zakresie wydajności (w niektórych przypadkach), a definicja
Anonimowy użytkownik
Potwierdzenie od:
jeśli ważna jest wysoka wydajność obciążenia, będziesz potrzebować AspectJ, który będzie 9-35x szybszy niż Spring AOP
... 10ns w porównaniu z 355ns może nie brzmieć dużo, ale widziałem ludzi używających aspektów WIELE. 10 tysięcy jest wartych aspektów. W takich przypadkach Twoja prośba może dotyczyć tysięcy aspektów. W takim przypadku dodajesz ms do tego żądania.
Patrzeć na
kontrola
http://docs.codehaus.org/display/AW/AOP+Benchmark
wskaźniki.
Anonimowy użytkownik
Potwierdzenie od:
http://static.springsource.org ... .html
poda wiele informacji prosto z pyska konia.
Rozdział
6.4-Wybór stylu deklaracji AOP do użycia
http://static.springsource.org ... osing
jest dla ciebie martwa, gdy omawia zalety i wady obu.
Punkt powinien być szczególnie interesujący
6.1.2 - Wiosenne funkcje i cele AOP
http://static.springsource.org ... -defn
& amp; rozdziały
6.2 - Wsparcie @Aspect
http://static.springsource.org ... pectj
i
6.8 - Używanie AspectJ z aplikacjami Spring
http://static.springsource.org ... pectj
.
Anonimowy użytkownik
Potwierdzenie od:
AOP jest jedną z najważniejszych części frameworka.
Kluczową kwestią do zrozumienia, jak działa AOP w Spring, jest to, że pisząc aspekt w Spring, używamy frameworka do budowania proxy dla twoich obiektów, z , jeśli Twój Bob implementuje interfejs lub przez CGLIB chyba że Twój Bob zaimplementuje jakiś interfejs. Pamiętaj, że musisz mieć cglib 2.2 w swojej ścieżce klas, jeśli używasz Springa przed 3.2. Od wiosny 3.2 jest to bezużyteczne, ponieważ cglib 2.2 był zawarty w jądrze.
Struktura utworzy serwer proxy, gdy zostanie utworzony Bob, który otacza twoje obiekty i dodaje kompleksowe funkcje, takie jak bezpieczeństwo, zarządzanie transakcjami, rejestrowanie i tak dalej.
Tworzenie proxy w ten sposób zostanie zastosowane, zaczynając od wyrażenia punktu przecięcia, które definiuje strukturę, aby zdecydować, które komponenty bean i metody zostaną utworzone jako proxy. Rada będzie bardziej odpowiedzialna niż twój kod. Pamiętaj, że w tym procesie punkt cięcia obejmuje tylko metody publiczne, które nie są uznane za ostateczne.
Teraz, podczas gdy w Spring AOP tkanie aspektów będzie wykonywane przez kontener po uruchomieniu kontenera, w AspectJ musisz to zrobić, a następnie skompilować kod poprzez modyfikację kodu bajtowego. Z tego powodu moim zdaniem podejście Springa jest prostsze i łatwiejsze w zarządzaniu niż AspectJ.
Z drugiej strony, w Spring AOP nie możesz wykorzystać pełnej mocy AOP, ponieważ implementacja odbywa się przez proxy, a nie przez modyfikacje kodu.
Podobnie jak w przypadku AspectJ, w SpringAOP możesz użyć tkania czasu rozruchu. Możesz skorzystać z tej funkcji wiosną zaimplementowanej przy użyciu agenta i niestandardowej konfiguracji, lub XML. Jako przykładu można użyć przestrzeni nazw. Jednak w Spring AOP nie możesz wyłapać wszystkich przypadków. Na przykład nie jest obsługiwany w Spring AOP.
Jednak w Spring AOP możesz skorzystać z używania AspectJ z fabryczną metodą w komponencie bean konfiguracji Spring.
Z tego powodu Spring AOP jest w zasadzie proxy utworzonym z kontenera, więc możesz używać AOP tylko dla wiosennych ziaren. Natomiast 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 generowane w całości z kompilatora Java, a aspekty są bardzo fajnym sposobem tworzenia proxy dla Twojego Spring Bob. W AspectJ, jeśli zmienisz kod, będziesz potrzebować więcej kompilacji i może być trudno zrozumieć, gdzie są splecione twoje aspekty. Nawet wyłączanie splotu na wiosnę jest łatwiejsze: za pomocą sprężyny usuwasz aspekt z konfiguracji, restartujesz i działa. W AspectJ musisz przekompilować kod!
W tkactwie AspectJ jest bardziej elastyczny niż Spring, ponieważ Spring nie obsługuje wszystkich opcji AspectJ. Ale moim zdaniem, jeśli chcesz zmienić proces tworzenia Boba, najlepszym rozwiązaniem jest zarządzanie niestandardowym logowaniem w fabryce, a nie tkanie aspektu czasu ładowania, 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
Anonimowy użytkownik
Potwierdzenie od:
artykuł
https://www.baeldung.com/spring-aop-vs-aspectj
jest też dobre wyjaśnienie tego tematu.
Spring AOP i AspectJ mają różne cele.
Spring AOP ma na celu zapewnienie prostej implementacji AOP poprzez Spring
IoC do rozwiązywania najczęstszych problemów programistów.
Z drugiej strony AspectJ to oryginalna technologia AOP, która ma na celu
zapewniają kompletne rozwiązanie AOP.
Anonimowy użytkownik
Potwierdzenie od:
Zatem instancja klasy proxy może być używana jako instancja klasy docelowej. Ogólnie rzecz biorąc, AOP ulepszony w czasie kompilacji jest bardziej korzystny pod względem wydajności - ponieważ AOP ulepszony w czasie wykonywania wymaga dynamicznych ulepszeń przy każdym uruchomieniu.
Anonimowy użytkownik
Potwierdzenie od:
[Dodałbym zastrzeżenie, że może być możliwe dostosowanie go w taki sposób, że tak nie jest; ale ja osobiście o tym nie wiem
]. Tkanie w czasie kompilacji pozwala na uniknięcie tego.
Ponadto, jeśli używasz AspectJ w połączeniu z wtyczką Aspectj-maven, możesz uruchomić testy jednostkowe dla swoich aspektów w środowisku CI i mieć pewność, że artefakty, które budujesz, są sprawdzane i tkane poprawnie. Chociaż możesz oczywiście pisać testy jednostkowe za pomocą dysku Spring, nadal nie masz gwarancji, że wdrożony kod będzie testowany w przypadku awarii LTW.
Inną kwestią jest to, czy hostujesz aplikację w środowisku, w którym możesz bezpośrednio kontrolować powodzenie lub niepowodzenie uruchomienia serwera/aplikacji, czy też aplikacja jest wdrażana w środowisku, nad którym nie masz nad nią kontroli [na przykład, gdzie jest hostowane przez klienta]. Ponownie, wskazywałoby to sposób tworzenia tkania w czasie kompilacji.
Pięć lat temu znacznie bardziej wspierałem SpringAOP z tego prostego powodu, że łatwiej było mi pracować i rzadziej żuć moje IDE. Jednak wraz ze wzrostem mocy obliczeniowej i dostępnej pamięci stało się to znacznie mniejszym problemem, a CTW z wtyczką Aspectj-maven stało się najlepszym wyborem w moim środowisku pracy z powodów, które opisałem powyżej.