Právě jsem úspěšně rozběhal Spring AOP ve stand-alone (newebové) aplikaci, takže si opět postup a poznatky zapíšu na web. Jako vždy si vyhrazuju právo mýlit se, ale snad jsem vše pochopil správně.
AOP je zkratka za Aspect Oriented Programming neboli „aspektově orientované programování“.
AOP zajišťuje ulehčení práce programátora v případech, kdy se při volání metod různých tříd volá vždy stejný nebo podobný kód – typickým příkladem je otevírání a uzavírání transakce, kontrola práv k provedení operace (autorizace), trasování běhu aplikace atd.
Aspekt je (společná) vlastnost či spíše potřeba některých metod – například právě potřeba otevřít a uzavřít transakci nebo ověřit práva.
Spring AOP je jedna z implementací AOP. Dále existují ještě AOP frameworky JBoss AOP (s tím se dostanu brzy do potyčky :-), AspectJ (ten to všechno začal a Spring AOP jej využívá) a AspectWerkz (nic moc).
Spring jde svojí obvyklou cestou co nejjednodušší konfigurace a co
nejstručnějšího zápisu. Můžete využít buď @Anotace ve stylu AspectJ
(@Aspect
, @Before
, @Pointcut
atd.), nebo
konfiguraci v XML souboru. Ukázka XML následuje.
Dříve (před verzí Spring 2.0) se konfigurace AOP prováděla poněkud neohrabaně nastavováním Beans (což popisuji v návodu Úplné začátky se Spring framework).
V současnosti se AOP nastavuje pomocí elementů z namespace
<aop:*>
. Tento jmenný prostor je třeba v XML souboru
zmínit, proto se místo DTD použije definice přes xmlns:aop
.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" > <!-- Před spuštěním metod tříd z balíku "aoptest" zavoláme metodu test() z beany s ID aopTestAdviceBean. --> <aop:config> <aop:pointcut id="aopTestPointcut" expression="execution(* aoptest.*.*(..))"/> <aop:aspect ref="aopTestAdviceBean"> <aop:before pointcut-ref="aopTestPointcut" method="test"/> </aop:aspect> </aop:config> <!-- Metoda této beany (objektu) se bude volat podle výše uvedeného pravidla. --> <bean id="aopTestAdviceBean" class="aoptest.AopTestAdviceBean"> <property name="foo" value="foo value"/> </bean> <!-- Automatické volání metod funguje jen pro objekty vytvořené Springem. --> <bean id="nejakaTrida" class="aoptest.NejakaTrida"> <property name="bar" value="bar value"/> </bean> </beans>
K tomu ještě pár poznámek:
aoptest.NejakaTrida objekt = new aoptest.NejakaTrida(); objekt.metoda(); // <--- ZDE AOP NEZAFUNGUJE!
XMLBeanFactory
použít „full verzi“, tedy třídu
ApplicationContext
.Celý kód pro rozjetí AOP tedy vypadá takto:
ApplicationContext ac = new ClassPathXmlApplicationContext("properties/SpringBeans.xml"); aoptest.NejakaTrida objekt = (aoptest.NejakaTrida) new aoptest.NejakaTrida(); objekt.metoda(); // <--- zde AOP zavolá napřed metodu aoptest.AopTestAdviceBean::test().
A k tomu samozřejmě definice příslušných tříd, myslím, že nemá cenu je zde vypisovat, jsou zcela obyčejné.
Použil jsem:
Konkrétně tyto .JAR soubory:
Tučně zvýrazněné jsou nutné (rozuměj „bez nich mi to nešlo“). U ostatních nevím – je možné, že některé jsou navíc, ale takto mi to funguje a tak neřeším.
Tolik tedy ke Spring AOP. Snad jsem na nic nezapomněl, ale v podstatě je to dost jednoduché.
Cokoliv dalšího nastudujete z velmi obsáhlého referenčního manuálu Springu, zejména oblasti: