ひがやすを技術ブログ

電通国際情報サービスのプログラマ

コンポーネントに対するAOP

これまでのAOPでは、Aspectの定義として、
どのAdvice(Interceptor)をどのクラスのどこ(Pointcut)に
組み込むのかを指定します。
横断的な関心(Crosscutting Concern)なので、
あたりまえジャンと思うかもしれませんが、
Adviceを組み込まれるクラス(コンポーネント)から見た場合、
どのようなAdviceが組み込まれたのか、
分かりづらくなります。
そのため、S2では、各コンポーネントに対して、
どのAdviceを組み込むのかを指定するようになってます。


<component name="requiredTxAdvice"
class="org.seasar.framework.tx.RquiredTxAdvice"/>
<component class="foo.Hoge">
<aspect>requriredTxAdvice</aspect>
</component>
<aspect pointcut="methodA,methodB">のように
指定したメソッドにだけ組み組むこともできます。
pointcutを指定しない場合は、コンポーネントが実装している
インターフェースのすべてのメソッドが対象になります。
コードで書くと

S2Container container = new S2ContainerImpl();
container.register(RequiredTxAdvice.class, "requiredTxAdvice");
ComponentDef cd = new ComponentDefImpl(Hoge.class);
AspectDef aspectDef = new AspectDefImpl();
aspectDef.setExpression("requiredTxAdvice");
cd.addAspectDef(aspectDef);
container.register(cd);