[java][seasar] S2AOPを触ってはみたものの
恥ずかしながら本格的にAOPプログラムをするのは、今回が初めて。ということで、S2AOPを試そうにも、「ポイントカットってどういう意味?」とか、「インタータイプとは何ぞや?」というところでつまづいて、なかなかスムーズに体得できていない。まあ、触りながら理解していくしかない。
とりあえず、SAStrutsのチュートリアルに独自のInterceptorを織り込んでみる。
package tutorial.interceptor; import org.aopalliance.intercept.MethodInvocation; import org.seasar.framework.aop.interceptors.AbstractInterceptor; public class HogeInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; /* (non-Javadoc) * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation) */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("@@@@@ HogeInterceptor BEFORE @@@@@"); Object ret = invocation.proceed(); System.out.println("@@@@@ HogeInterceptor AFTER @@@@@"); return ret; } }
app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="convention.dicon"/> <include path="app.dicon"/> <include path="j2ee.dicon"/> <include path="s2jdbc.dicon"/> <component name="hogeInterceptor" class="tutorial.interceptor.HogeInterceptor"/> </components>
customizer.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="default-customizer.dicon"/> <component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> (中略) <initMethod name="addAspectCustomizer"> <arg>"hogeInterceptor"</arg> </initMethod> </component> </components>
で、とりえあず動いてくれた。おー、楽しい。
customizer.diconで、
<initMethod name="addAspectCustomizer"> <arg>"hogeInterceptor"</arg> <arg>"do.*, initialize, prerender"</arg> </initMethod>
は
<initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"hogeInterceptor"</property> <property name="pointcut">"do.*, initialize, prerender"</property> </component> </arg> </initMethod>
と書いても同じように動いてくれる。同じことするのに、何で2通りもあるのかと思ったら、「addCustomizerするんだったら直接addAspectCustomizerってできたら便利だよね」ということっぽい。確かに便利。