Aspektově orientované programování je jiný přístup k programováni, který umožňuje poměrně elegantně řešit některé problémy, které se v klasických programovacích jazycích řeší zbytečně složitě. AOP není revoluční, ale spíše evoluční krok, nejedná se ani o konkurenta ani o následovníka, ale spíše o doplněk ke klasickému objektově orientovanému programování …
Principem AOP je soustředění některých částí stále se opakujícího kódu do tzv. aspektů. Tyto aspekty pak mohou být “roubovány” na volání metod tříd, na přístup k instančním proměnným atd. Aspekt je tedy část kódu, která může být volána před, za a nebo kolem určité metody nebo skupiny metod.
Podívejme se na příklad:
public class UserDAO { /** Updates user * @param userToBeUpdated user that should be updated * @param userThatIsUpdating user that is updating */ public void updateUser(User userToBeUpdated, User userThatIsUpdating) { // check permission checkPermission(userThatIsUpdating, Permission.ADMIN); // continue work .. } /** Deletes user * @param userToBeRemoved user that should be removed * @param userThatIsUpdating user that is updating */ public void removeUser(User userToBeRemoved, User userThatIsUpdating) { // check permission checkPermission(userThatIsUpdating, Permission.ADMIN); // continue work .. } }
Je tu vidět, že šedě označená část se vyskytuje ve více metodách. Proto můžeme tuto část brát jako aspekt a můžeme ji vyčlenit ven z této třídy. AOP Framework potom tímto aspektem obohatí metody, které mu určíme.
Dalším příkladem aspektu může být třeba otevírání a uzavírání transakce, bezpečnostní kontrola, cachování, … Dá se také použít také na ladění a profiling.
Nyní se soustředím na AOP v Javě a pokusím se vyjmenovat hlavní přístupy k implementaci AOP.
Vložení aspektu do třídy v době kompilace
Tento přístup provádí obohacení třídy o aspekt v době kompilace třídy. Aspekty jsou napevno svázané s třídou a jsou tedy přítomny v každé její instanci. Toto řešení bývá velmi výkonné (téměř jako ruční zakomponování aspektu do třídy), a je nezávislé na classloaderu či aplikačním serveru. Nejvýraznějším zástupcem tohoto přístupu přístup je AspectJ, nejstarší a nejvyzrálejší zástupce AOP Frameworků.
Použití speciálního classloaderu
Tento přístup obohacuje třídy o aspekty až před použitím, tedy online. Aspekt nemusí být v každé instanci třídy. K zakomponování aspektu se nejčastěji používá byte code enhancement nebo dynamické proxy. Příkladem tohoto přístupu jsou např. AspectWerkz nebo JBoss AOP. Nevýhodou je potřeba mít speciální classloader (např. v aplikačním serveru u JBossu), případně spouštět program ne pomocí příkazu java, ale přes startovací skript daného AOP Frameworku (AspectWerkz).
Použití dynamických proxy z J2SE 1.3+
Tento mechanismus využívá standardního nástroje z J2SE, dynamických proxy. Umožňuje mít aspekty jen u některých instancí třídy. Je nezávislý na classloaderu, může být použiván prakticky kdekoliv v kódu. Obohacování můžete řídit “ručně”, nebo ho můžete svěřit IoC kontajneru (např. factory beanu v Spring Frameworku). Příkladem implementace tohoto přístupu je např. Spring Framework AOP nebo Nanny Aspects.
V dalším dílu si ukážeme nějaký praktický příklad použití AOP v praxi.
tento článek se mě velice líbyl nevěděl sem co to AOP je a tento článek my to přesně objasnil good job (seznam search)