[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ってできたら便利だよね」ということっぽい。確かに便利。