Obsah
Aspektově orientované programování (Aspect-oriented programming, AOP) se v poslední době stalo velmi populární technikou napomáhající zpřehlednění vývoje složitých systémů.
Nemáme prostor na detailní rozbor této programovací techniky, takže se spokojíme s výstižnou charakteristikou Tomáše Pitnera v [4]: „AOP v zásadě směřuje k tomu, jak elegantně dosáhnout vyčlenění opakovaných „nezáživných“, „režijních“ částí kódu, řešících obvykle nějaké (mimofunkční, napříč jdoucí) záměry (cross-cutting concerns, např. autentizaci/autorizaci klienta při vstupu do určité metody, protokolování volání metod, přístup k perzistentnímu úložišti dat …) do tzv. pokynů (advices). Tyto jsou vyčleněny do speciálních tříd a deklarativním způsobem je řečeno, kam všude se příslušný pokyn má aplikovat (ta místa se označují jako point-cuts). Běhové prostředí příslušného nástroje pro AOP pak zajistí aplikaci příslušného pokynu a vzniká tak tzv. aspekt (aspect).“
AOP funkcionalita tvoří klíčovou složku rámce Spring™, který je často označován jako IoC a AOP kontejner. Možnosti AOP jsou zde opravdu poměrně široké a základní principy si na příkladech předvedeme i my.
V rámci Spring™ je AOP využíváno jako prostředek pro:
poskytnutí deklarativních služeb, zejména tedy deklarativního transakčního managementu,
tvorbu uživatelských aspektů.
Jednotlivé stavební prvky AOP modulu si teď stručně představíme.
Rámec Spring™ podporuje většinu v AOP komunitě používaných typů pokynů. Těmi základními jsou pokyny-interceptory (Interception Around Advice), které jsou aplikovány před i po vyvolání metody, dále předsazené pokyny (Before Advice), které se volají pouze před vyvoláním metody, pokyny výjimek (Throws Advice), které jsou volány pouze pokud cílová metoda vyhodí výjimku konkrétního typu, a konečně pokyny po návratu (After Returning Advice), které se provedou pouze po úspěšném návratu řízení z cílové metody.
Ukážeme si příklad nejpoužívanějšího typu pokynů, tedy pokynu-interceptoru. Příklad je převzat z [5] a mírně upraven.
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MessageDecorator implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.print("Startuji dekoraci ...");
Object retVal = invocation.proceed();
System.out.println("Končím dekoraci ...");
return retVal;
}
}
Vidíme, že pokyn implementuje rozhraní
MethodInterceptor a jeho metodu
invoke, v jejímž průběhu zavolá cílovou metodu
a její návratovou hodnotu nakonec také vrátí. Jsou použita standardní
rozhraní AOP Alliance
API™, takže knihovnu s tímto API je nutno umístit do classpath
každé aplikace využívající AOP funkcionality rámce
Spring™.