Lekcja 1.5: Spring AOP

Spring AOP

 

Na poprzednim przykładzie widzieliśmy, w jaki sposób za pomocą Springa możemy automatyzować proces tworzenia, konfigurowania i zarządzania komponentami w naszej aplikacji. Teraz spróbujemy jeszcze pokazać programowanie aspektowe. Doprowadzimy do tego, że część dotycząca logowania, która do tej pory była zaimplementowana w obiekcie typu proxy i nakładana manualne przez nas na poziomie konfiguracji będzie zaaplikowana w sposób automatyczny z użyciem Springa i programowania aspektowego. Musimy zacząć od podpięcia kolejnych zależności. Otwieramy plik pom.xml i dodajemy zależność do biblioteki AspectJ. To jest najbardziej popularna biblioteka, która pozwala na realizację programowania aspektowego w ekosystemie Javy. Tak jak wspomniałem w części teoretycznej aspekty to klasy, które będą zawierały pewną dodatkową logikę. Logikę boczną np. związaną z logowaniem, a ich kod będzie automatycznie aplikowany wokół metod docelowych komponentów. W związku z tym powinniśmy zacząć od zdefiniowania klasy aspektu, powinniśmy zacząć od tego, że stworzymy taką klasę, która będzie realizowała nasze logowanie, w sposób bardzo podobny do naszego serwisu logującego, natomiast mocno uproszczony. Stwórzmy zatem klasę PaymentConsoleLogger. Dodajmy tu kod, który był odpowiedzialny za logowanie informacji o płatnościach. Każdy aspekt powinien być także komponentem Springowym, czyli tak jak w poprzednich przypadkach powinniśmy dodać tu adnotację @Component. Na tym etapie dodam, że to nie jest jedyna adnotacja, która będzie pozwalała na to, żeby definiować nowe komponenty. Kolejne poznamy w następnym module. Dodatkowo powinniśmy oznaczyć aktualną klasę właśnie jako aspekt, służy do tego adnotacja @Aspect. Pozostaje nam jeszcze dodanie metody, która faktycznie będzie realizowała logowanie. Teraz ostatni etap to jest kwestia połączenia tej metody logującej z oryginalną metodą process w naszej usłudze FakePaymentService. Musimy mieć jakiś sposób na to, żeby przy użyciu konfiguracji połączyć te dwie rzeczy, żeby opakować ten oryginalny kod za pomocą naszej metody logującej. My robiliśmy to w tym poprzednim, pierwszym przypadku poprzez ręczną konfigurację. Teraz możemy to zrobić bardziej generycznie. Zobaczcie mamy adnotację @AfterReterning, ta adnotacja będzie oznaczała, że metoda log powinna się wykonać po zakończeniu określonej metody. No właśnie jakiej metody. Tę określoną metodę możemy wskazać poprzez specjalne wyrażenie tzw. desygnator. Mamy do dyspozycji wiele takich desygnatorów. Ja zdecydowałem się użyć taki który będzie opierał się o adnotację. Taka adnotacja użyta na poziomie docelowej metody będzie powodowała, że uruchomiony zostanie proces logowania. Dodajmy zatem adnotację którą nazwiemy @LogPayments. To będzie bardzo prosta adnotacja. Jedyne czego oczekujemy to to, że będzie ona dostępna na poziomie wykonania naszego kodu tzn. że kompilator nie usunie jej w czasie kompilacji. To wymaga dodania odpowiedniej polisy, ale jednocześnie możemy też powiedzieć, że powinna być ona stosowana tylko i wyłącznie na poziomie metody. Czyli możemy ustawić target na wariant metod. Teraz możemy przejść do konfiguracji, czyli na poziomie naszego logera możemy powiedzieć, że tym naszym selektorem będzie adnotacja @LogPayments. A w związku z tym tę samą adnotację możemy umieścić na poziomie usługi FakePaymentService. To jest sposób na powiązanie tych dwóch rzeczy. Zwróćcie uwagę, że adnotacja może być traktowana jako forma konfiguracji, jako meta dane, meta informacja. W związku z tym będzie dosyć łatwo tu przypiąć za chwilę inną implementację tego aspektu. Jeżeli wrócimy do naszej klasy logującej, to widzimy, że ten kod się nie kompiluje, jest tu ewidentnie problem. Jeżeli spróbujemy zobaczyć co się wydarzyło, to jest informacja, że mamy niepodpięty parametr Payment. Jeżeli chcemy przechwycić Payment, zwracane z oryginalnej metody, to powinniśmy jeszcze powiedzieć Springowi pod jaki parametr naszej metody log on powinien być podstawiony. W związku z tym możemy dodać jeszcze jeden atrybut returning i powiedzieć, że ta płatność zwracana w metodzie process, w FakePaymentService powinna być postawiona pod Payment w naszej metodzie log. I to jest wszystko, jeżeli chodzi o implementację aspektu. Pozostaje nam jeszcze kwestia ogólnej konfiguracji Springa, chcemy powiedzieć, że korzystamy z ApectJ i Spring powinien generować obiekty proxy, obiekty pośredniczące. To wymaga dodania jeszcze jednej klasy konfiguracyjnej. Na poziomie takiej klasy dodajmy adnotację @Configuration. To jest adnotacja, która wskazuje, że jest to klasa konfiguracyjna, a jednocześnie używamy adnotacji, która trochę działa jak przełącznik i mówi o tym, że będziemy korzystali AspectJ i generowania proxy. Na koniec możemy pozbyć się wcześniejszej implementacji usługi logującej. Teraz na poziomie naszej głównej klasy, na poziomie klasy Application możemy poprosić Springa o PaymentService. Spróbujmy teraz uruchomić nasz kod. Okazuje się, że wszystko działa. Widać, że nasz kod dotyczący logowania został po raz kolejny zaaplikowany. Mamy informacje o tym, że płatność została zrealizowana i wszystko działa w porządku.

Zaloguj się
Rejestracja jest darmowa!

Administratorem danych jest Sages Sp. z o.o. z siedzibą w Warszawie przy ul. Nowogrodzkiej 62c. Podanie danych jest dobrowolne. Osobie, której dane dotyczą przysługuje prawo wglądu do danych osobowych, ich zmiany oraz usunięcia w sposób określony w Polityce prywatności.

Please accept the Terms and Conditions to proceed.