-S10: AntilockBrakeSystem

これまでコンテナ登録コンポーネントの初期化方法を説明してきました。さて、Seasar2のステキな機能の一つにAOPへの対応があります。AOPは数年前よりその概念はあり、AspectJなどのコンパイラベースで提供する製品はありましたが、最近、軽量コンテナには競って搭載される機能となりました。AOPがとにかくはじめての方も多いでしょうから、まずAOPそのものやSeasar2AOPメカニズムを説明するまえに論よりRUN、例を示していきます。

list10-1. BrakingCar.java
package tutorial.org.seasar.console;
public class BrakingCar implements Car {
  public void run() {
    System.out.println("Brake!"); 
  }
}

list10-1のBrakingCarはコンストラクタ、プロパティ、初期化メソッドのまったくないシンプルなクラスです。インターフェイスCarに定義されているメソッドrun()のみを実装しています。そのrun()メソッドすらもシンプルです。文字列"Brake!"を出力するだけです。

list10-2. ABS.java
package tutorial.org.seasar.console;
import org.seasar.framework.aop.AroundAdvice;
import org.seasar.framework.aop.Joinpoint;
public class ABS implements AroundAdvice {
  public Object invoke(Joinpoint joinpoint) throws Throwable {
    System.out.println("Ooops, danger!");
    Object ret = joinpoint.proceed();
    System.out.println("kikikiki...");
    return ret;
  }
}

list10-2のABSはBrakingCarに追加的な文字列出力を行うクラスです。

lost10-3. <aspect>記述を行ったcar.xml修正版
<?xml version="1.0" encoding="UTF-8"?>
<components>
  <component class="tutorial.org.seasar.console.BrakingCar">
    <aspect pointcut="run">
      <component class="tutorial.org.seasar.console.ABS"/>
    </aspect>
  </component>
</components>

実行結果は、以下のとおりです。

Ooops, danger!

Brake!

kikikiki...

相変わらずつまらない例ですが、意外とすごいことが起こってるんですよ。