23時50分のSeasar見聞録

本家は『23時50分』に書いてます。

2004-05-30AOPお勉強

[] サンプル見て打ち込み 00:34

http://www.seasar.org/、ひがさん(d:id:higayasuo)の日記、d:id:masataka_kさんのチュートリアル、id:skimuraさんの日記等を読ませて頂きながら、仕事からのGreat Escape、もといお勉強中です。

 Eclipse3.0M9+JDK1.5Beta2+S2.0.9の環境ですが、Eclipse3.0良いわ♪*1

 先月はチュートリアルを軽く斜め読みしてたんですが、d:id:masataka_kさんのサンプルをビール飲みながらポチポチ打ち込んでました。

 http://d.hatena.ne.jp/masataka_k/20040330#p4

 Type4(JDBCを連想しました)とAOPの組み合わせの例は面白かったです。

 S2って自由度高いですねえ、他のDIコンテナ触ったこと無いけど・・・なんか、人によっては、MCPとかSJCとかの試験で「実行される順番を答えよ」、みたいな問題がいくらでも作られそうなノリです。といってもベンダ系の試験の問題みたいなコードを現場を書かれたらレビューで吊るし上げになるんでしょうけど。

チュートリアルそのまんまですが、メモとして(勝手にお借りします、問題があれば削除します)

 ・定義ファイルのcar.dicon


<components>
  <component class="tutorial.org.seasar.console.InGarageCar">
    <initMethod name="init"/>
    <initMethod>#out.println("(4)========= Method Injection02")</initMethod>
    <aspect pointcut="init">
      <component class="tutorial.org.seasar.console.Navigator"/>
    </aspect>
    <aspect pointcut="run">
      <component class="tutorial.org.seasar.console.ABS"/>
    </aspect>
  </component>
</components>

 ・core concernのInGarageCar.java

package tutorial.org.seasar.console;
public class InGarageCar implements Car {
	public void init(){
		System.out.println("(2) ShiShi, shi, go away! Method Injection01");
	}
	public void run() {
		System.out.println("(6) Cat) Nyaaago! Highway.main");
	}
}

 ・crosscutting concernのNavigator.java

package tutorial.org.seasar.console;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class Navigator implements MethodInterceptor {
	public Object invoke(MethodInvocation invocation) throws Throwable {
	    System.out.println("(1) Ah! Cat on the way! InterCeptor01 started before Method Injection01.");
	    Object ret = invocation.proceed();
	    System.out.println("(3) Ouch, I have blown the tongue. InterCeptor01 ended afterMethod Injection01");
	    return ret;
	}
}

 ・crosscutting concernのABS.java

package tutorial.org.seasar.console;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class ABS implements  MethodInterceptor  {
	public Object invoke(MethodInvocation invocation) throws Throwable {
	    System.out.println("(5) Ooops, danger! Interceptor02 started before Highway.main.");
	    Object ret = invocation.proceed();
	    System.out.println("(7) kikikiki... Interceptor02 ended after Highway.main.");
	    return ret;
	}
}

(追記)タブが崩れてるけど、面倒だからいいや

で、チュートリアル通りに

(1) Ah! Cat on the way! InterCeptor01 started before Method Injection01.
(2) ShiShi, shi, go away! Method Injection01
(3) Ouch, I have blown the tongue. InterCeptor01 ended after Method Injection01
(4)========= Method Injection02
(5) Ooops, danger! Interceptor02 started before Highway.main.
(6) Cat) Nyaaago! Highway.main
(7) kikikiki... Interceptor02 ended after Highway.main.

 となりました、面白さに感動ですね。Method Injection01がS2から呼ばれる前にInterceptor01が割り込み、Method Injection02が実行され、ようやくmainで呼び出されるrunメソッドの番になりInterceptor02に割り込まれるんですかあ。

 用語の使い方は怪しいので追々、web上の各リソースで勉強させて頂くとして、柔軟性アリアリですね。アプリケーション内でのcore concernとcrosscutting concernの定義が凄く悩まれます。いや、ログ管理、コネクションプーリング、トランザクションとかがcrosscutting concernの適用例として取り上げられますけど、特定のアプリケーション内でのcrosscutting concernを発見する作業はある程度の経験が無いとハマりそうです。OOP以上に抽象⇔具体のイメージをささっと発想する力が要るのかな?

[] とはいえ 00:34

aopallianceのJavaDoc、OGNLのマニュアルと参照するのが、面白い。S2に触れる前は、知らないトピックだらけなので新鮮で楽しい。

 でも、S2DAOがリリースされたら、AOPお勉強は中断、自分のアプリでの移行を材料に熱中の予定ね。