EJB 3.0, Interceptory a Spring
Se zájmem jsem si včera přečetl noticku Pavla Kolesnikova o
Druhý Early Draft EJB 3.0. Sice jsem se tím nechtěl
vůbec zaobírat, ale stejně jsem neodolal a začetl jsem se do diskuse na TSS. Rozhořela
se tam pro mě zajímavá diskuse Annotation vs. XML config, ale to budu komentovat příště. Není žádnou novinkou,
že JBoss v oblasti EJB 3.0 nezahálí a poskytuje velice
rychle EJB 3.0 preview, jak někdo poznamenal JSR 220 je JBoss camp.
Dneska se na TSS objevil spot JBoss EJB 3.0 Preview 3 Is Out, který mě
nahlodal a já jsme neodolal zběžně jsem nakouknul do tutorialu. Aniž bych
zkoumal specifikaci, zaujaly mě interceptory. Teď si vypůjčím slova Pavla Kolesnikova
interceptory (uživatelé aplikačního serveru JBoss či přiznivci AOP jistě tuší): interceptor je buď metoda, která se “vsune” do volání business metody nebo třída, jejíž metody fungují interceptor dané třídy (danou třídou je myšlena pouze session či message driven EJB komponenta)
Ve vzpomínaném tutoriálu je interceptorům věnována solidní část, která jejich význam
celkem demonstuje. Mě osobně přijdou Interceptory jako příjemné sblížení s AOP. Na druhou si neodpustím malé
rýpnutí, tohle máme zavedené a používáme v aplikačním frameworku Spring
díky AOP již dávno. Je libo malou ukázku?
Interceptor
package my;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;public class TracingInterceptor implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
long start = System.currentTimeMillis();
try{
invocation.proceed();
}finally{
long time = System.currentTimeMillis() - start;
System.out.println("Invocation time: "+ time + "ms");
}
}
}Takto definovaný interceptor, v podstatě aspekt, si dáme do application context
(konfigurace Springu).
Advisor
Proto abychom mohli tento Interceptor použít, musíme ještě definovat tzv. Advisor,
který určuje jestli se daný interceptor použije či nikoliv. Řekněme, že chceme náš
interceptor napojit na metodu getFoo, využijeme jeden ze standardních Advisorů, které jsou ve Springu k dispozici. Opět
konfigurace v application context.
getFooNapojení Intercetporu na konkrétní třídu
No a nyní, opět deklarativně, napojíme interceptor na vybraný objekt, v našem případě objekt Foo.
my.IFoo
myAdvisorPro dokresleni vlastní objekt Foo včetně rozhraní.
package my;
public interface IFoo{
public Object getFoo();
}package my;
public class Foo implements IFoo{
public Object getFoo(){
//do something
}
}Kde miluje anotace více než deklarativní XML, může je využít viz Spring Source Level Metadata Support.
Související články
Související epizody CZ Podcastu
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.
- #1 · Vývojová prostředí v Javě
První díl CZ Podcastu se věnuje vývojovým prostředím pro Javu.