Spring AOP - Podstawy

Programowanie zorientowane na aspekty (Aspect-Oriented Programming, AOP) w Spring Framework to podejście, które pozwala na oddzielenie określonych aspektów działania aplikacji – takich jak logowanie, bezpieczeństwo, czy zarządzanie transakcjami – od głównej logiki biznesowej. AOP oferuje potężne narzędzie do modularyzacji tych przekrojowych problemów, umożliwiając bardziej przejrzysty i łatwiejszy do zarządzania kod.

Spring umożliwia nam korzystanie z AOP na dwa sposoby:

  • Poprzez używanie deklaratywnych usług

    Spring Boot zapewnia szereg gotowych aspektów, które można wykorzystać bez konieczności pisania własnego kodu aspektowego. Obejmują one między innymi:

    Zarządzanie transakcjami — Spring Boot umożliwia deklaratywne zarządzanie transakcjami za pomocą adnotacji @Transactional. Jest to jedno z najczęściej stosowanych zastosowań AOP w Springu, umożliwiające łatwe kontrolowanie transakcji bazodanowych.

    Bezpieczeństwo — Za pomocą Spring Security można deklaratywnie zarządzać dostępem do różnych części aplikacji, wykorzystując aspekty bezpieczeństwa, takie jak adnotacje @PreAuthorize i @PostAuthorize.

    Logowanie i monitorowanie — Spring Boot może automatycznie rejestrować zdarzenia, takie jak wejście i wyjście z metod, dzięki wbudowanym mechanizmom AOP.
  • Poprzez tworzenie własnych (customowych) aspektów

    Oprócz wykorzystania gotowych aspektów, Spring pozwala również na definiowanie własnych, niestandardowych aspektów. Taka możliwość jest szczególnie przydatna, gdy potrzebujemy zaimplementować bardziej złożone lub specyficzne zachowania przekrojowe, które nie są bezpośrednio obsługiwane przez standardowe aspekty Springa.

    Tworzenie własnych aspektów wymaga zdefiniowania klasy z adnotacją @Aspect i określenia logiki aspektów, takich jak porady (Advice), punkty złączenia (Join points) i punkty przecięcia (Pointcuts). Dzięki temu możemy precyzyjnie określić, jak i kiedy nasze niestandardowe zachowania mają być stosowane w aplikacji. Poniżej znajduje się przykład takiego własnego aspektu, który ilustruje, jak można zastosować tę technikę do rozwiązania konkretnych potrzeb aplikacji.

Prosty przykład AOP

Załóżmy, że budujemy aplikację webową, w której każde wywołanie metody biznesowej musi być zalogowane. W tradycyjnym podejściu, logowanie wymagałoby umieszczania kodu logującego w każdej metodzie, co szybko staje się uciążliwe i prowadzi do duplikacji kodu. Zamiast tego, AOP pozwala nam zdefiniować "aspekt" logowania tylko raz, a następnie zastosować go tam, gdzie jest potrzebny, bez ingerencji w samą logikę biznesową.
@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Before("execution(* com.javappa.startapp.service.*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        logger.info("Entering method: " + joinPoint.getSignature().toShortString());
    }

    @After("execution(* com.javappa.startapp.service.*.*(..))")
    public void logAfterMethod(JoinPoint joinPoint) {
        logger.info("Exiting method: " + joinPoint.getSignature().toShortString());
    }
}
W tym przykładzie:

— Adnotacja @Aspect oznacza, że klasa jest aspektem
— Adnotacja @Component pozwala na skanowanie komponentów i automatyczne wykrycie aspektu przez Spring
— Metody logBeforeMethod i logAfterMethod są poradami (@Before i @After), które są wywoływane odpowiednio przed i po wykonaniu metody biznesowej
— Wyrażenie execution(* com.javappa.startapp.service.*.*(..)) określa punkty przecięcia, tj. metody w klasach w pakiecie com.javappa.startapp.service, na które ma wpływ aspekt

Koncepcje AOP i ich realizacja w Spring AOP

Realizacja założeń AOP możliwa jest poprzez zastosowanie koncepcji:

  • Aspekt (Aspect)

    Wspomniana na początku modularyzacja problemu obejmującego (przecinającego) wiele klas.

    Spring AOP: Realizacja przez użycie regularnych klas, bądź klas adnotowanych @AspectJ.
  • Punkt złączenia (Join point)

    Punkt podczas wykonywania programu, w którym następuje wykonanie metody lub obsługa wyjątku.

    Spring AOP: Realizacja przez wyznaczenie punktu na wykonaniu metody (zawsze).
  • Porada (Advice)

    Moment działania aspektu (określony przez punkt połączenia), taki jak: dookoła (around), przed (before), po (after).
    Na przykład: dookoła wywołania metody, przed wykonaniem metody, po wykonaniu metody.

    Spring AOP: Realizacja przez przechwycenie (interception) właściwego momentu działania wraz
    z utrzymaniem łancucha interceptorów zgromaczonych wokół punku złączenia.
  • Punkt przecięcia (Pointcut)

    Warunek określający wystąpienie punktu złączenia, w którym należy uruchomić odpowiednią poradę.

    Spring AOP: Realizacja przez użycie wyrażeń punktów języka AspectJ.
  • Wprowadzenie (Introduction)

    Deklarowanie dodatkowych metod lub pól w imieniu typu, które mogą być pomocne podczas stosowania porady.

    Spring AOP: Realizacja pojęcia umowy między typami w ramach AspectJ.
  • Obiekt docelowy (Target object)

    Obiekt, któremu "doradza" przynajmniej jeden obiekt (posiada przynajmniej jedną poradę).

    Spring AOP: Realizacja poprzez użycie proxy (wspomniany obiekt jest zawsze obiektem proxy).
  • Proxy AOP (AOP proxy)

    Obiekt stworzony w celu implementacji umów aspektu (sposobów doradzania w kontekście wykonywania metody)

    Spring AOP: Realizacja poprzez dynamiczne proxy JDK lub proxy CGLIB.
  • Tkanie (Weaving)

    Łączenie aspektów w określonym czasie z obiektami w celu utworzenia obiektu posiadającego poradę.

    Spring AOP: Realizacja wsytępuje w czasie wykonywania kodu (runtime).
Appa Notka. Ponad 5 godzin o samym Spring AOP z polskimi napisami!

Analizujemy kolejne kursy na Udemy, wykorzystując nasze doświadczenie zawodowe do oceny ich efektywności i popularności wśród uczestników. Z dużym zaangażowaniem selekcjonujemy te, które naszym zdaniem są najbardziej efektywne i jednocześnie cieszą się uznaniem uczestników.

Chád Darby to autor, wykładowca i mówca specjalizujący się w rozwoju aplikacji Java. Jest uznawany za autorytet w dziedzinie aplikacji i architektur Java, a także międzynarodowo znany dzięki swojej firmie i obecności w mediach społecznościowych. Jest współautorem kilku książek o Javie i regularnie zapraszany jest do prezentacji sesji technicznych na konferencjach dotyczących rozwoju oprogramowania na całym świecie. Posiada certyfikaty Java od Oracle i IBM, a jego firma Luv2Code pomaga programistom szybko uczyć się najnowszych technologii Java za pomocą artykułów i samouczków wideo. Chád uzyskał licencjat z informatyki na Carnegie Mellon University.

Rodzaje porad w Springu AOP

Spring AOP dostarcza kilka przydatnych typów porad. Przyjrzyjmy się im nieco bliżej:

  • Przed (Before)

    Porada jest uruchamiana przed punktem sprzężenia (punktem złączenia). Może przerwać dalsze wykonywanie kodu tylko poprzez wyrzucenie wyjątku. W każdym innym przypadku proces dotrze do punktu złączenia.
  • Po powrocie (After returning)

    Porada jest wykonywana po tym, jak proces przejdzie przez punkt złączenia (moment wykonywania "śledzonej" metody) bez żadnych wyjątków.
  • Po rzuceniu (After throwing)

    Porada, którą ma zostać wykonana gdy uruchamiana metoda (co stanowi punkt złączenia) zostanie zakończona przez zgłoszenie wyjątku.
  • Po (After)

    Porada wykonywana zawsze, niezależnie od tego w jaki sposób kończy się punkt złączenia (w jaki sposób kończy się nasze obecnie śledzone wykonanie metody).
  • Dookoła (Around)

    Porada o największej mocy sprawczej, gdyż jest ona uruchamiana tuż przed punktem złączenia jakim jest wykonanie metody, a następnie umożliwia obsługe tego punktu złączenia (np. niewykonanie go w momencie zaistnienia określonego warunku). Na końcu swojego działania może jeszcze wykonać operacje po zakończeniu uruchomionej metody (jeśli wcześniej nie przerwała procesu, np. nie doprowadzając do uruchomienia metody).
Jak widać poradę można więc przedstawić jako sposób na śledzenie kolejnych momentów wykonywania procesu, którego częścią kluczową jest uruchomienie metody (punkt złączenia), po to by następnie wprowadzić tam odpowiednio skonstruowane rozwiązania programistyczne.
Rekomendacja
Warto stosować aspekty, ponieważ wtedy nasz kod staje się bardziej modularny, czytelny i łatwiejszy w utrzymaniu. Aspekty pozwalają unikać powtarzania kodu (DRY - Don't Repeat Yourself), co jest kluczowe w budowaniu efektywnych i łatwych do zarządzania systemów.

Ponadto, AOP umożliwia deweloperom skoncentrowanie się na rozwiązaniu głównych problemów biznesowych, jednocześnie zapewniając, że wszystkie niezbędne zadania pomocnicze są obsługiwane w sposób spójny i centralny. Jest to szczególnie przydatne w dużych, złożonych aplikacjach, gdzie zarządzanie aspektami takimi jak bezpieczeństwo i transakcje może być wyzwaniem.
Praktyka


W ramach naszych kursów dotyczących Springa, stosujemy aspekty do rejestrowania czasów wykonania metod. Wykorzystujemy do tego celu klasę LogAspect.
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Topowe Materiały
Spring IO: Aspect Oriented Programming with Spring
Baeldung: Introduction to Spring AOP
Baeldung: Comparing Spring AOP and
Baeldung: Implementing a Custom Spring AOP Annotation
Jstobigdata: Complete Spring AOP Tutorial

Udemy: [NEW] Spring Boot 3, Spring 6 & Hibernate for Beginners  —  polskie napisy

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE