連載
» 2007年11月01日 00時00分 公開

Spring 2.0時代の開発スタイル(3):Spring 2.0で自分なりの開発スタイルを確立しよう (1/3)

[山本大,株式会社クロノス]

 前回の記事でSpring 2.0の新機能について解説しました。今回はSpring 2.0のAOP(アスペクト指向プログラミング)機能と新しく追加されたWebに対応するBeanスコープについて解説します。

 AOPとは、プログラムに対して後付けで処理を織り込む仕組みです。AOPについての詳細は、以前の連載「Spring Frameworkで理解するDI」第3回「Spring AOPサンプルアプリでAOPを理解する」を参照ください

AOPネームスペースを使ってHello World!!

 AOPネームスペースは、Spring AOPの設定を処理するタグを含むネームスペースです。Spring 2.0ではAOP機能が強化されました。特に、AspectJとの統合が強力で、従来のプロキシベースAOPに加えて、「AspectJスタイルのAOP」が利用できるようになりました。

編集部注AspectJについて詳しく知りたい読者は、@IT情報マネジメント アーキテクチャ記事『AspectJから学ぶアスペクト指向の理解』をご参照ください。

 AOPネームスペースではSpringがサポートするさまざまなバリエーションに対応したAOPを利用するためのタグが用意されています。ここでは、AOPネームスペースの利用方法を、サンプルを使って簡単に解説します。

AspectJライブラリのインストール

 この章で作成するサンプルでは、AspectJの機能を利用してAOPを実現します。AspectJの機能を利用するために、AspectJのライブラリをインストールする必要があります。これらの依存ライブラリはAspectJのダウンロードサイトからダウンロードできます(または、Springのwith-dependenciesディストリビューションにも含まれています。ダウンロードファイル名は「spring-framework-X.X.X-with-dependencies.zip」です)。

図1 AspectJのダウンロードサイト 図1 AspectJのダウンロードサイト

 Eclipseで以下のライブラリにビルドパスを設定してください。

・aspectjlib.jar
・aspectjweaver.jar
・cglib-X.X.jar(Xはバージョン番号。本稿では、cglib-nodep-2.1_3.jarを利用)

サンプルプログラムの構成

 以下(表1)にサンプルプログラムの構成ファイル一覧を表します。

作成するファイル 概要 備考
ao.xml Spring構成ファイル 配置場所:
%ソースディレクトリ%\ao.xml
AdviceSample.java プログラムに後から織り込む処理 クラス名:net.kronos_jp.aop.AdviceSample
SampleBean.java hello()メソッドを持つサービスオブジェクト。AOPによって処理が織り込まれる クラス名:net.kronos_jp.aop.SampleBean
SpringStart.java 起動プログラム。Springのコンテキストを作成し、SampleBeanのhell()メソッドを実行する クラス名:net.kronos_jp.aop.SpringStart
表1 サンプルで作成するファイルの一覧

aopネームスペースに対応したSpring構成ファイルを作成

 Spring IDE 2.0をインストール済みのEclipse(Spring IDE 2.0のインストールについては連載第1回を参照してください)で、ソースディレクトリのルートを選択します。そして、[ファイル(F)]→[新規(N)]→[その他(O)]を選択し、新規ファイル作成の[ウィザード選択ダイアログ]を開いてください。ダイアログ上のツリーから[Spring]→[Spring Bean Definition]を選択したうえで、新しいSpringの構成ファイル名(ここでは、「ao.xml」)を入力し、[次へ >(N)]ボタンをクリックして、ウィザードを進めます。

図2 構成ファイル作成ウィザード画面(AOPネームスペースの読み込み) 図2 構成ファイル作成ウィザード画面(AOPネームスペースの読み込み)

 上記の画面(図2)でAOPネームスペースを読み込むようチェックを付けて[終了(F)]ボタンを押下することで、以下(リスト1)のファイルが作成されます(太字がAOPネームスペースの利用のための記述)。

リスト1 ao.xmlファイルの初期状態(※このファイルには後ほどサンプルに必要な定義を追加記述します)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop-2.1.xs
d
">
</beans>

サンプルプログラムの準備(AOP使用前)

 次に、サンプルプログラムでAspectを織り込む先のBeanとして「SampleBean.java」(リスト2)を作成します。

リスト2 SampleBean.java
package net.kronos_jp.aop;

public class SampleBean {
    public void hello(){
        System.out.println("Hello world!!");
    }
}

 上記のサンプルロジックを含むSampleBeanを呼び出すための、アプリケーション起動プログラムとして「SpringStart.java」(リスト3)を作成します。

リスト3 SpringStart.java
public class SpringStart {
    public static void main(String[] args) {
        // アプリケーションコンテキストの取得
        ApplicationContext contxt =
        new ClassPathXmlApplicationContext("ao.xml");

        // Beanの取得
        SampleBean sample = (SampleBean)contxt.getBean("sampleBean");
        sample.hello();
    }
}

 上記のプログラムが動作するようにao.xmlにsampleBeanの定義を追記します(リスト4)。

リスト4 ao.xmlへの追記(1)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-2.1.xsd">

  <!-- ↓この部分を追記 -->
  <bean id="sampleBean"
    class="net.kronos_jp.aop.SampleBean" />
  <!-- ↑この部分を追記 -->
</beans>

 以上が完成したら、SpringStart.javaプログラムを実行してください。以下のようにメッセージが表示されればOKです。この時点では、まだAspectは織り込まれていません。

Hello world!!

 では続けて、このプログラムにAspectを織り込みたいと思います。

サンプルプログラムの作成(AOP使用後)

 サンプルに織り込むAspectとして「AdviceSample.java」(リスト5)を作成します。このクラスはafterHello()というメソッドを持つだけのPOJOです。

編集部注:POJOそのものについて詳しく知りたい読者は、「J2EE Watch 第11回、米JBossは米Red Hatとマーケットシェア拡大を狙う」の「*2:POJO」を参照してください。

 このafterHello()メソッドがhello()メソッドの後に実行されるようにAOPで織り込みます。織り込みに利用するメソッド名に制約はありませんので、どのような名称のメソッドを付けることも可能です。

リスト5 AdviceSample.java
package net.kronos_jp.aop;

public class AdviceSample {
    public void afterHello(){
       System.out.println(
            "AOPによるafterHello()の呼び出しです。");
    }
}

 次に、Spring構成ファイルを修正する必要があります。ao.xmlファイルに以下(リスト6)の<aop:config />タグを記述してください。

リスト6 ao.xmlへの追記(2)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-2.1.xsd">

  <!-- ↓以下の記述を追記 -->
  <aop:config>
    <aop:aspect id="sample" ref="sampleAdvice">
      <aop:pointcut id="pointcut"
         expression="execution(* hello())" />
      <aop:after pointcut-ref="pointcut"
         method="afterHello" />
    </aop:aspect>
  </aop:config>

  <bean id="sampleAdvice" 
    class="net.kronos_jp.aop.AdviceSample"/>
  <!-- 追記ここまで -->

  <bean id="sampleBean" class="net.kronos_jp.aop.SampleBean" />
</beans>

 以上の修正が完了したら、SpringStart.javaプログラムを実行してください。以下のようにメッセージが表示されれば完成です。AOP記述によって機能が織り込まれたことが確認できます。

Hello world!!
AOPによるafterHello()の呼び出しです。

 次ページで、Spring構成ファイルの詳細(リスト6で使用しているAOPネームスペースのタグ)を解説していきます。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。