TOMÁŠ HUBÁLEK BLOG: BAVTE SE PŘIMĚŘENĚ…

Aspektově orientované programování (AOP): K čemu je to dobré?

Written By: Tomáš Hubálek - Nov• 17•04

JavaAspektově 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.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

One Comment

  1. Wer a rým says:

    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)

Leave a Reply

Your email address will not be published. Required fields are marked *