{"id":2500,"date":"2021-02-25T20:51:46","date_gmt":"2021-02-25T19:51:46","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=2500"},"modified":"2021-02-25T20:51:46","modified_gmt":"2021-02-25T19:51:46","slug":"programowanie-aspektowe-w-jezyku-java-czyli-aspectj-w-praktyce-co-to-jest","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2021\/02\/25\/programowanie-aspektowe-w-jezyku-java-czyli-aspectj-w-praktyce-co-to-jest\/","title":{"rendered":"Programowanie aspektowe w j\u0119zyku Java, czyli AspectJ w praktyce. Co to jest?"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>J\u0119zyk Java pod wieloma wzgl\u0119dami jest naprawd\u0119 uniwersalny i pozwala zastosowa\u0107 wiele r\u00f3\u017cnorodnych technik, kt\u00f3re w znacznym stopniu pozwalaj\u0105 upro\u015bci\u0107 proces tworzenia aplikacji. Tematem dzisiejszego wpisu jest biblioteka AspectJ i zwi\u0105zane z ni\u0105 programowanie aspektowe.  Dowiemy si\u0119 np.: jak w przezroczysty spos\u00f3b mierzy\u0107 czas wywo\u0142ania metod? Jak zaimplementowa\u0107 prosty, przezroczysty dla programisty system uprawnie\u0144? Je\u015bli chcia\u0142by\u015b pozna\u0107 odpowiedzi na powy\u017csze pytania, przeczytaj \ud83d\ude42 <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co to jest programowanie aspektowe?<\/h2>\n\n\n\n<p>Ju\u017c w pierwszych linijkach tego wpisu pojawi\u0142o si\u0119 nowe poj\u0119cie: &#8222;programowanie aspektowe&#8221;. Co to u licha jest? Sp\u00f3jrzmy na definicj\u0119:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Programowanie aspektowe (aspect-oriented programming, AOP) to paradygmat tworzenia program\u00f3w komputerowych wspomagaj\u0105cy separacj\u0119 zagadnie\u0144 i rozdzielenie programu na cz\u0119\u015bci w jak najwi\u0119kszym stopniu niezwi\u0105zane funkcjonalnie. <\/p><\/blockquote>\n\n\n\n<p>Definicja definicj\u0105, ale co ona w sumie oznacza? Wyobra\u017amy sobie prosty program, kt\u00f3ry realizuje zapis informacji do bazy. Ca\u0142a operacja musi odby\u0107 si\u0119 w jednej transakcji bazodanowej, gdy\u017c dane musz\u0105 zachowa\u0107 sp\u00f3jno\u015b\u0107. Jak taka operacja mog\u0142aby wygl\u0105da\u0107?<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/867a7341236ad1ab9391366a3da66d67.js\"><\/script>\n\n\n\n<p>Sp\u00f3jrz na powy\u017cszy listing. W\u0142a\u015bciwa logika zapisu do bazy danych znajdowa\u0142aby si\u0119 mi\u0119dzy linijkami 4 a 8. Ca\u0142a reszta to tzw. boilerplate, kt\u00f3ry w ka\u017cdym wypadku b\u0119dzie taki sam. <\/p>\n\n\n\n<p>Jak wygl\u0105da\u0142a obs\u0142uga transakcji gdy u\u017cywamy frameworka Spring? Bajecznie prosto.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/d1de7c77951611c1219c871ce8facaee.js\"><\/script>\n\n\n\n<p class=\"example_code\">Nad metod\u0105, kt\u00f3ra ma by\u0107 realizowana wewn\u0105trz transakcji dodajemy adnotacj\u0119 <em>@Transactional. <\/em>To w\u0142a\u015bnie ta adnotacja dba o ca\u0142o\u015bciowy proces obs\u0142ugi transakcji. <\/p>\n\n\n\n<p>Obs\u0142uga adnotacji @Transactional, zosta\u0142a stworzona za pomoc\u0105 aspekt\u00f3w. Kod \u017ar\u00f3d\u0142owy takiego aspektu mo\u017cesz obejrze\u0107 <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/master\/spring-aspects\/src\/main\/java\/org\/springframework\/transaction\/aspectj\/JtaAnnotationTransactionAspect.aj\" target=\"_blank\">przechodz\u0105c pod ten adres. <\/a> Poni\u017cej znajduje si\u0119 fragment listingu, kt\u00f3ry zawiera tzw. <em>Pointcuty <\/em>o kt\u00f3rych powiemy sobie co nieco w dalszej cz\u0119\u015bci artyku\u0142u. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/d3eec6d2d33c8130b7f16775e4aaa4f0.js\"><\/script>\n\n\n\n<p>W jaki spos\u00f3b dzia\u0142aj\u0105 aspekty? Podczas uruchamiania aplikacji, aspekt jest &#8222;doczepiany&#8221; do konkretnych metod. O tym, do kt\u00f3rych metod oraz w kt\u00f3rym momencie aspekt zostanie przypi\u0119ty, decyduje tzw <em>Pointcut <\/em>oraz rodzaj aspektu. Procedura obs\u0142ugi aspektu mo\u017ce by\u0107 wywo\u0142ywana przed, w trakcie lub po wywo\u0142aniu danej metody. Za pomoc\u0105 aspekt\u00f3w mo\u017cemy wykona\u0107 wiele naprawd\u0119 ciekawych rzeczy, kt\u00f3re w istotny spos\u00f3b uproszcz\u0105 i uprzyjemni\u0105 proces tworzenia oprogramowania. <\/p>\n\n\n\n<p>W runtime, wykonanie aspektu mo\u017cna zobrazowa\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"967\" height=\"370\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/image-1.png\" alt=\"\" class=\"wp-image-2554\" srcset=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/image-1.png 967w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/image-1-300x115.png 300w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/image-1-768x294.png 768w\" sizes=\"(max-width: 967px) 100vw, 967px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Wymagane zale\u017cno\u015bci &#8211; Maven<\/h2>\n\n\n\n<p>W celu dodania mechanizmu aspekt\u00f3w do naszego programu, musimy doda\u0107 kilka zale\u017cno\u015bci. Ich lista znajduje si\u0119 na listingu poni\u017cej:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/1f56ce2e274c14a3ea0c0134eba9a042.js\"><\/script>\n\n\n\n<p class=\"example_code\">Warto tak\u017ce nad g\u0142\u00f3wn\u0105 klas\u0105 naszej aplikacji springowej umie\u015bci\u0107 adnotacj\u0119 <em>@EnableAspectJAutoProxy<\/em>.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/504a4655914f5c243da60083bcde9b30.js\"><\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Najprostszy aspekt &#8211; pomiar czasu wykonania metody<\/h2>\n\n\n\n<p>Wyobra\u017amy sobie, \u017ce mamy jak\u0105\u015b aplikacj\u0119, kt\u00f3ra ma problemy natury wydajno\u015bciowej. Aby m\u00f3c dowiedzie\u0107 si\u0119, co jest &#8222;w\u0105skim gard\u0142em&#8221; takiej aplikacji, musimy wiedzie\u0107 ile czasu zajmuje wywo\u0142anie poszczeg\u00f3lnych metod. W jaki spos\u00f3b mo\u017cemy to zrobi\u0107? <\/p>\n\n\n\n<p>Najprostszy spos\u00f3b to dodanie pomiaru czasu przed i po wywo\u0142aniu metod. Lecz r\u0119czne i jawne zakodowanie takiego pomiaru nie zawsze jest najbardziej czytelne i najszybsze. Bo co zrobi\u0107 w sytuacji, kiedy chcemy doda\u0107 taki pomiar do kilkuset r\u00f3\u017cnych metod? No w\u0142a\u015bnie. W tym miejscu z pomoc\u0105 przychodz\u0105 aspekty. Projekt, na bazie kt\u00f3rego b\u0119dziemy pracowali znajduje si\u0119 <a href=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\" data-type=\"URL\" target=\"_blank\" rel=\"noreferrer noopener\">tutaj<\/a>. <\/p>\n\n\n\n<p>Najpierw sp\u00f3jrzmy, jak wygl\u0105da nasza implementacja serwis\u00f3w. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/51e953ad10c91a9f2aadc97367b3d997.js\"><\/script>\n\n\n\n<p class=\"example_code\">Nie ma tu nic skomplikowanego. Mamy cztery serwisy, kt\u00f3re realizuj\u0105 jak\u0105\u015b bli\u017cej nieznan\u0105 logik\u0119. Chcemy, aby nasz aspekt logowa\u0142 czas wykonania ka\u017cdej z tych metod. Na samym ko\u0144cu znajduje si\u0119 metoda <em>addUser(UserData userData)<\/em>. Dla niej napiszemy aspekt, kt\u00f3ry pozwoli zalogowa\u0107 argument wej\u015bciowy. <\/p>\n\n\n\n<p>Zdefiniujmy, w kt\u00f3rym momencie powinien wywo\u0142ywa\u0107 si\u0119 aspekt. Chcemy dokona\u0107 pomiaru czasu wywo\u0142ania ka\u017cdej publicznej metody. Aspekt powinien wykonywa\u0107 si\u0119 tylko dla naszych serwis\u00f3w. (Nie potrzebujemy pomiaru czasu wykonania metod pochodz\u0105cych z u\u017cywanych przez nas bibliotek. Nie potrzebujemy tak\u017ce pomiaru czasu wykonania repozytori\u00f3w lub innych klas kt\u00f3re nie s\u0105 serwisem). Sp\u00f3jrz na poni\u017cszy listing. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/dabb543a30373ae6ebf861f96eaf0c17.js\"><\/script>\n\n\n\n<p>W linijce 6 zdefiniowali\u015bmy <em>Pointcut. <\/em>Pointcut informuje o tym, jakie warunki musi spe\u0142nia\u0107 metoda aby aspekt m\u00f3g\u0142 zosta\u0107 wywo\u0142any. Przyjrzyjmy si\u0119 jemu dok\u0142adniej. <\/p>\n\n\n\n<p><em>&#8222;execution&#8221; <\/em>oznacza, \u017ce aspekt zostanie uruchomiony dla ka\u017cdej metody, kt\u00f3rej sygnatura spe\u0142nia odpowiednie warunki. Argument dla &#8222;execution&#8221; ma nast\u0119puj\u0105c\u0105 posta\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">execution(rodzaj_metody zwracany_argument pakiet.nazwa_klasy.nazwa_metody(argumenty)<\/pre>\n\n\n\n<p>Wobec powy\u017cszego, zapisany w powy\u017cszym listingu Pointcut mo\u017cemy przet\u0142umaczy\u0107 w nast\u0119puj\u0105cy spos\u00f3b: &#8222;Uruchom aspekt dla ka\u017cdej publicznej metody zwracaj\u0105cej dowolne dane, kt\u00f3ra znajduje si\u0119 w pakiecie pl.kompikownia.blog.aspect.timemeasurement.service i przyjmuje dowolne argumenty. <\/p>\n\n\n\n<p class=\"example_code\">Metoda <em>runMeasure <\/em>zawiera logik\u0119 aspektu. Zwr\u00f3\u0107 uwag\u0119, \u017ce ma ona specyficzn\u0105 sygnatur\u0119 i oznaczona jest adnotacj\u0105 <em>@Around. <\/em>Adnotacja <em>@Around <\/em>oznacza, \u017ce mo\u017cemy doda\u0107 dodatkowy kod zar\u00f3wno przed jak i po wywo\u0142aniu metody. Metoda oznaczona adnotacj\u0105 @Around musi zwraca\u0107 <em>Object <\/em>oraz przyjmowa\u0107 argument typu <em>ProceedingJoinPoint. <\/em>W <em>ProceedingJoinPoint <\/em>znajduje si\u0119 wszystko co potrzebne do ustalenia, jaka metoda zosta\u0142a wywo\u0142ana, z jakimi argumentami itd. <\/p>\n\n\n\n<p class=\"example_code\">W aspekcie wykonujemy pomiar czasu. Poza pomiarem czasu zapisujemy moment wywo\u0142ania i zako\u0144czenia wykonania metody. Zwr\u00f3\u0107 uwag\u0119 na linijk\u0119 13, w kt\u00f3rej znajduje si\u0119 kod <em>pjp.proceed(); <\/em>Ta linijka wywo\u0142uje metod\u0119, kt\u00f3rej wywo\u0142anie przechwycili\u015bmy za pomoc\u0105 aspektu. Wszystko to, co znajduje si\u0119 przed t\u0105 linijk\u0105 dzieje si\u0119 przed wywo\u0142aniem metody. Wszystko to co za &#8211; po zako\u0144czeniu wykonywania przechwyconej metody. <\/p>\n\n\n\n<p>Je\u015bli u\u017cywasz \u015brodowiska Intellij IDEA, mo\u017cesz w bardzo prosty spos\u00f3b sprawdzi\u0107, czy prawid\u0142owo napisa\u0142e\u015b aspekt. Obok ka\u017cdego utworzonego aspektu pojawia si\u0119 specjalna ikona. Je\u015bli na ni\u0105 klikniesz, wy\u015bwietlona zostanie lista wszystkich metod do kt\u00f3rych aspekt zostanie doczepiony. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"438\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-31-45-1024x438.gif\" alt=\"\" class=\"wp-image-2522\" srcset=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-31-45-1024x438.gif 1024w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-31-45-299x128.gif 299w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-31-45-767x328.gif 767w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Wynik dzia\u0142ania aspektu przedstawiony zosta\u0142&nbsp;poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"502\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-35-29-1024x502.gif\" alt=\"\" class=\"wp-image-2525\" srcset=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-35-29-1024x502.gif 1024w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-35-29-300x147.gif 300w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-35-29-767x376.gif 767w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_14-35-29-1536x753.gif 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Jak widzisz, zosta\u0142 zalogowany moment wywo\u0142ania metody (dzie\u0144, czas), moment zako\u0144czenia wykonania metody oraz \u0142\u0105czny czas, jaki po\u015bwi\u0119cono na jej wykonanie. (6292 ms). <\/p>\n\n\n\n<p>Mo\u017cesz uruchomi\u0107 ten przyk\u0142ad na swoim komputerze. Projekt znajduje si\u0119<a href=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\/tree\/measurement-aspect\" data-type=\"URL\" data-id=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\/tree\/measurement-aspect\" target=\"_blank\" rel=\"noreferrer noopener\"> w tym miejscu. <\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aspekt loguj\u0105cy argumenty metody<\/h2>\n\n\n\n<p>Zwi\u0119kszymy nieco poziom trudno\u015bci. Naszym nast\u0119pnym celem jest stworzenie aspektu, kt\u00f3ry zaloguje argumenty, z jakimi zosta\u0142a wywo\u0142ana metoda. B\u0119dziemy chcieli te\u017c zalogowa\u0107 rezultat wykonania metody. Aspekt b\u0119dziemy chcieli wywo\u0142a\u0107 dla wszystkich metod, kt\u00f3re zawieraj\u0105 co najmniej jeden argument*.<\/p>\n\n\n\n<p>Sp\u00f3jrz na poni\u017cszy listing, kt\u00f3ry zawiera rzeczony aspekt. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/ae3d4ab2d72d8431f4ba56a1b8333ce9.js\"><\/script>\n\n\n\n<p class=\"example_code\">Zacznijmy od pocz\u0105tku. Przyjrzyj si\u0119 linijkom 22-23. Stworzyli\u015bmy nowy <em>Pointcut. <\/em>Zmienili\u015bmy fragment odpowiedzialny za argumenty metody. Zamiast (..) wstawili\u015bmy (Object+,..). Co to oznacza? Pierwszym argumentem metody musi by\u0107 klasa Object lub klasa dziedzicz\u0105ca po Object (+). Kolejne argumenty mog\u0105 by\u0107 dowolne. Dzi\u0119ki temu aspekt zostanie uruchomiony dla dowolnych metod, kt\u00f3re zawieraj\u0105 co najmniej jeden argument. <\/p>\n\n\n\n<p class=\"example_code\">W ciele metody korzystamy z <em>ProceedingJoinPoint<\/em> w taki spos\u00f3b, aby odczyta\u0107 argumenty oraz rezultat wywo\u0142ania metody. <\/p>\n\n\n\n<p>Przyk\u0142ad dzia\u0142ania programu mo\u017cesz zobaczy\u0107 poni\u017cej. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"538\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_15-38-15-1023x538.gif\" alt=\"\" class=\"wp-image-2530\" srcset=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_15-38-15-1023x538.gif 1023w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_15-38-15-300x158.gif 300w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_15-38-15-768x404.gif 768w, https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2021\/02\/vokoscreen-2021-02-07_15-38-15-1536x808.gif 1536w\" sizes=\"(max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n\n\n\n<p><strong>Zagadka: <\/strong>Jak\u0105 sygnatur\u0119 musi mie\u0107 metoda, kt\u00f3ra przyjmuje co najmniej jeden argument ale nie zostanie dla niej wywo\u0142any powy\u017cszy aspekt?<\/p>\n\n\n<span class=\"collapseomatic \" id=\"id6a56d1b48bb86\"  tabindex=\"0\" title=\"Rozwi\u0105zanie zagadki\"    >Rozwi\u0105zanie zagadki<\/span><div id=\"target-id6a56d1b48bb86\" class=\"collapseomatic_content \">\nPowy\u017cszy aspekt nie zostanie uruchomiony dla metod, kt\u00f3re jako pierwszy argument przyjmuj\u0105 typ prosty (int, char itd). Wynika to z faktu, \u017ce typy proste nie dziedzicz\u0105 po klasie Object.<br \/>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Pe\u0142ny kod \u017ar\u00f3d\u0142owy programu, kt\u00f3ry zosta\u0142 przedstawiony powy\u017cej <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\/tree\/measurement-aspect-2\" data-type=\"URL\" data-id=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\/tree\/measurement-aspect-2\" target=\"_blank\">znajduje si\u0119 tutaj<\/a>. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Realne zastosowanie aspekt\u00f3w &#8211; weryfikacja uprawnie\u0144<\/h2>\n\n\n\n<p class=\"example_code\">Spr\u00f3bujmy teraz napisa\u0107 sobie aspekt, kt\u00f3ry obs\u0142u\u017cy stworzon\u0105 przez nas adnotacj\u0119. Nazwijmy j\u0105 <em>@CheckPermission<\/em>. Jako argument b\u0119dzie przyjmowa\u0142a nazw\u0119 uprawnienia. B\u0119dziemy chcieli stworzy\u0107 aspekt, kt\u00f3ry b\u0119dzie uruchamia\u0142 si\u0119 dla ka\u017cdej metody oznaczonej t\u0105 adnotacj\u0105. Je\u015bli u\u017cytkownik ma uprawnienia do uruchomienia metody &#8211; uruchomimy j\u0105. W przeciwnym wypadku zwr\u00f3cimy wyj\u0105tek. Najpierw napiszmy definicj\u0119 adnotacji. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/3c1c074c69e84123c8fe9dff1827205e.js\"><\/script>\n\n\n\n<p class=\"example_code\">Jest to standardowa adnotacja, uruchamiana w Runtime <em>(RetentionPolicy.RUNTIME)<\/em>. Adnotacja mo\u017ce by\u0107 umieszczona tylko nad metodami (<em>ElementType.METHOD)<\/em>. Zajmijmy si\u0119 teraz aspektem. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/d148b61f88b355072abf77d7825779ea.js\"><\/script>\n\n\n\n<p class=\"example_code\">Najpierw sp\u00f3jrzmy na pointcut znajduj\u0105cy si\u0119 w linijce 12. Opr\u00f3cz <em>execution <\/em>u\u017cyli\u015bmy nowego typu:<em> @annotation<\/em>. W nawiasie podali\u015bmy, dla jakiego rodzaju adnotacji pointcut ma si\u0119 wykonywa\u0107. Sp\u00f3jrz teraz na linijk\u0119 15. Przede wszystkim, zamiast <em>@Around <\/em>u\u017cyli\u015bmy adnotacji <em>@Before. <\/em>Oznacza ona, \u017ce aspekt zostanie uruchomiony przez wywo\u0142aniem metody spe\u0142niaj\u0105cej warunki. Zerknij teraz na argument tej adnotacji. Mo\u017cesz zobaczy\u0107, jak mo\u017cna \u0142\u0105czy\u0107 r\u00f3\u017cne Pointcuty ze sob\u0105. W tym wypadku aspekt zostanie uruchomiony dla ka\u017cdej publicznej metody, kt\u00f3ra zosta\u0142a oznaczona adnotacj\u0105 <em>@CheckPermission. <\/em><\/p>\n\n\n\n<p>W tre\u015bci metody obs\u0142uguj\u0105cej pointcut mo\u017cesz zobaczy\u0107, jak mo\u017cna z obiektu <em>JointPoint <\/em>wyci\u0105gn\u0105\u0107 informacj\u0119 o metodzie, dla kt\u00f3rej zosta\u0142 wywo\u0142any aspekt. W tym wypadku odczytujemy adnotacj\u0119 i sprawdzamy jej argumenty. Na ich podstawie decydujemy, czy nale\u017cy wyrzuci\u0107 wyj\u0105tek czy nic nie robi\u0107. (W przypadku @Before oznacza to, \u017ce metoda zostanie normalnie wykonana).<\/p>\n\n\n\n<p>Jak wygl\u0105da u\u017cycie naszej stworzonej przed chwil\u0105 adnotacji? Bardzo prosto! Sp\u00f3jrz na poni\u017cszy listing. <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/karol221-10\/60a4ec39b1946a232532cba706c16e76.js\"><\/script>\n\n\n\n<p>Kod powy\u017cszej aplikacji dost\u0119pny jest <a href=\"https:\/\/github.com\/karol221-10\/blog-timemeasurement\/tree\/measurement-aspect-3\">w tym miejscu. <\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowuj\u0105c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Gdzie warto u\u017cywa\u0107 aspekt\u00f3w?<\/h3>\n\n\n\n<p>Aspekt\u00f3w warto u\u017cywa\u0107 przede wszystkim w zastosowaniach poruszonych w tym artykule. Aspekt\u00f3w u\u017cywa si\u0119&nbsp;do realizacji typowo  &#8222;technicznego&#8221; kodu, takiego jak transakcyjno\u015b\u0107, kt\u00f3ry m\u00f3g\u0142by zmniejsza\u0107 czytelno\u015b\u0107 kodu realizuj\u0105cego biznesow\u0105 funkcjonalno\u015b\u0107. Mechanizmu tego warto tak\u017ce u\u017cywa\u0107 w celu obs\u0142ugi logowania r\u00f3\u017cnych informacji podczas dzia\u0142ania aplikacji. Ostatnim elementem, gdzie cz\u0119sto mo\u017cna spotka\u0107 aspekty jest szeroko poj\u0119te <em>Security<\/em> &#8211; obs\u0142uga uprawnie\u0144, kontekstu u\u017cytkownika itd. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gdzie nie warto u\u017cywa\u0107 aspekt\u00f3w?<\/h3>\n\n\n\n<p>Przede wszystkim &#8211; nie powinni\u015bmy ich nadu\u017cywa\u0107 \ud83d\ude42 Je\u015bli wewn\u0105trz aspekt\u00f3w b\u0119dziemy umieszczali kod, kt\u00f3ry m\u00f3g\u0142by zosta\u0107 zrealizowany w postaci zwyk\u0142ej metody, nasz kod stanie si\u0119 nie bardziej, a mniej czytelny. Aspekty jakby nie patrze\u0107 nieco zaburzaj\u0105 tradycyjny przep\u0142yw sterowania w programie, o czym nale\u017cy pami\u0119ta\u0107. <\/p>\n\n\n\n<p>Aspekty s\u0105 naprawd\u0119 ciekawym mechanizmem, kt\u00f3ry warto bli\u017cej pozna\u0107. Przydaj\u0105 si\u0119 one do wykonania operacji kt\u00f3re wykonuj\u0105 si\u0119 &#8222;obok&#8221; lub &#8222;pomi\u0119dzy&#8221; kodem biznesowym. <\/p>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 lista link\u00f3w, pod kt\u00f3rymi mo\u017cesz dowiedzie\u0107 si\u0119 nieco wi\u0119cej o tym mechani\u017amie:<\/p>\n\n\n\n<ul><li><a href=\"https:\/\/docs.spring.io\/spring-framework\/docs\/4.2.x\/spring-framework-reference\/html\/aop.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.spring.io\/spring-framework\/docs\/4.2.x\/spring-framework-reference\/html\/aop.html<\/a><\/li><li><a href=\"https:\/\/nullpointerexception.pl\/jak-korzystac-ze-spring-aop\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nullpointerexception.pl\/jak-korzystac-ze-spring-aop\/<\/a><\/li><li><a href=\"https:\/\/www.tutorialspoint.com\/spring\/aop_with_spring.htm\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.tutorialspoint.com\/spring\/aop_with_spring.htm<\/a><\/li><\/ul>\n\n\n\n<p>Je\u015bli artyku\u0142 ci si\u0119 podoba\u0142, oka\u017c to \ud83d\ude42 Polub m\u00f3j fanpage na FB oraz zapisz si\u0119 na newsletter (wszystko znajduje si\u0119 po prawej stronie). Dzi\u0119ki newsletterowi co jaki\u015b czas otrzymasz informacje o nowo\u015bciach na blogu, a tak\u017ce pewne unikalne tre\u015bci, kt\u00f3rych nie zdob\u0119dziesz w inny spos\u00f3b \ud83d\ude42 Zach\u0119cam tak\u017ce do w\u0142\u0105czenia powiadomie\u0144. Mo\u017cesz to zrobi\u0107, klikaj\u0105c czerwono-bia\u0142y dzwoneczek w prawej dolnej cz\u0119\u015bci ekranu.<\/p>\n\n\n\n<p>Je\u015bli zauwa\u017cysz jaki\u015b b\u0142\u0105d, b\u0119dziesz mia\u0142 problem &#8211; nie b\u00f3j si\u0119, napisz komentarz. Na pewno znajdziemy jakie\u015b rozwi\u0105zanie.<\/p>\n\n\n\n<p>Do zobaczenia \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> J\u0119zyk Java pod wieloma wzgl\u0119dami jest naprawd\u0119 uniwersalny i pozwala zastosowa\u0107 wiele r\u00f3\u017cnorodnych technik, kt\u00f3re w znacznym stopniu pozwalaj\u0105 upro\u015bci\u0107 proces tworzenia aplikacji. Tematem dzisiejszego wpisu jest biblioteka AspectJ i &#8230;<\/p>\n","protected":false},"author":1,"featured_media":2053,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[77],"tags":[107,106,76,73,105],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/2500"}],"collection":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/comments?post=2500"}],"version-history":[{"count":52,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/2500\/revisions"}],"predecessor-version":[{"id":2560,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/2500\/revisions\/2560"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media\/2053"}],"wp:attachment":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media?parent=2500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=2500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=2500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}