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

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

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

AspectJスタイルのSpring構成ファイル記述

 前述(リスト6)の構成ファイルでは、XSDスタイルでAOPネームスペースのタグを利用して既存プログラムに機能を織り込んでいます。利用しているAOPタグの詳細は以下(表2)です。

利用しているタグ 詳細
<aop:config> AOP設定の親となるタグ
<aop:aspect>〜</aop:aspect> Aspectを作成するタグ。PointcutとAdviceをref属性によって利用するアドバイスを設定している(ここでは、sampleAdvice)
<aop:pointcut /> AspectJのポイントカット定義を行うタグ。expression="execution(* hello())"
<aop:after /> pointcut-ref="pointcut" method="afterHello"
表2 サンプルで利用しているaopタグ

 この設定の中でポイントとなるのは、<aop:pointcut />タグで記述している、AspectJ方式のポイントカットの指定式です。このポイントカット記法では、柔軟なポイントカットが記述できるように、いくつかの構文が用意されています。以下でこの構文を少しだけ解説します。

AspectJスタイルのポイントカット記述

 以下(表3)で、SpringAOPで利用できるAspectJのポイントカットの式と例を紹介します。なお、これらのポイントカットはSpringAOPのBean定義で管理されたクラスのメソッドのみに適用できます。

AspectJ書式 概要
execution(* XX)

※XXに適用するメソッドのパターンを記述
指定したメソッドの呼び出しに対して適用するポイントカット execution(* net.kronos_jp.aop.SampleBean.*(..))
※net.kronos_jp.aop.SampleBeanクラスのすべてのpublicメソッドに適用
execution(* net.kronos_jp.aop.*.*(..))
※net.kronos_jp.aopパッケージのすべてのpublicメソッドに適用
execution(* net.kronos_jp..*.*(..))
※net.kronos_jpパッケージおよびサブパッケージで定義されたすべてのpublicメソッドに適用
within(XX)

※XXに適用するクラスのパターンを記述
指定したクラスで定義されたメソッドに対する呼び出しに適用するポイントカット(サブクラスやスーパークラスでの呼び出しには適用しない) within(net.kronos_jp.aop.SampleBean)

※SampleBeanクラスおよびサブクラスで定義されたメソッドに対する呼び出しに適用
target(XX)

※XXに適用するクラスのパターンを記述
指定したクラスおよびサブクラスから、呼び出すメソッドに適用するポイントカット target(net.kronos_jp.aop.SampleBean)

※SampleBeanクラスおよびサブクラスから呼び出すメソッドに適用
args(XX)

※XXに適用するメソッドシグネチャパターンを記述
呼び出し先のメソッドの引数の型が一致するメソッドに適用するポイントカット args(java.lang.String)

※Stringパラメータを1つ取るメソッドにAspectを適用
表3 AspectJの書式と概要

 SpringAOPで、AspectJ方式のポイントカットを取り入れることによってより柔軟なAspectの織り込みができるようになりました。Spring 2.0でのAOP機能はほかにもさまざまな改良がなされています。

 実際にSpring Frameworkを利用した開発者からも、「Springを使っていて最も価値があると感じるのは、AOP機能が利用できることだ」という声さえ聞かれます。

 SpringAOPでは、AspectJのすべての機能を利用できるわけではありませんが、Springがサポートする範囲の機能であっても十分に強力な効力を発揮します。上記にて紹介した構文以外にもいくつかの演算子などが利用できますので、詳細については以下の【AspectJ関連のドキュメント】をご参照ください。

Beanのスコープがより多機能に

 以前のバージョンのSpringでは、コンテナレベルでサポートしているスコープはsingletonprototypeの2つのスコープだけでした。それに対してSpring 2.0では、requestやsessionといったWeb環境でのスコープが追加されています。また、ユーザーは独自に定義したスコープを追加することもできます。

 Spring 2.0でサポートするスコープの一覧を以下(表4)に表します。

スコープ 概要
singleton Beanのインスタンスをコンテナに対して1つだけにする
prototype Beanのインスタンスをいくつでも作れるようにする(通常のオブジェクト)
request HTTPの1回のライフサイクルに限定したスコープを持つBeanを定義する。
それぞれすべてのHTTPリクエストごとに、1つのBeanのインスタンスを保持できる。SpringのApplicationContextにWebを認識させている場合のみ利用可能
session HTTPセッションの1回のライフサイクルに限定したスコープを持つBeanを定義。SpringのApplicationContextにWebを認識させている場合のみ利用可能
global session Portletフレームワーク環境で利用。通常のサーブレットベースのWebアプリケーションでglobal sessionスコープの記述をした場合、内部ではsessionスコープが利用される
表4 Spring2.0でサポートするスコープ

編集部注:Portlet(ポータル)フレームワークそのものについて詳しく知りたい読者は、「Jetspeedで学ぶポータル構築」を参照してください。

Beanのインスタンスをコンテナに対して1つだけにするsingletonスコープ

 Beanをsingletonにしたいとき、1つのインスタンスを共有して利用する場合や、Springのコンテナに指定するIDによって取得するオブジェクトを切り分けたいときに、このスコープを利用します。

 singletonスコープはSpringでBeanを定義した際のデフォルトのスコープです。また、Spring 2.0で改定された新しいDTDである「spring-beans-2.0.dtd」を使った場合、singletonの記述方法が以前と異なっているので、注意が必要です。

リスト7 以前のバージョンでのsingletonスコープBeanのDTD記述書式
<bean id="sample" class="net.kronos_jp.aop.SampleBean"
  singleton="true"/>

リスト8 Spring 2.0でのsingletonスコープBeanのDTD記述書式
<bean id="sample" class="net.kronos_jp.aop.SampleBean"
  scope="singleton"/>

Beanのインスタンスをいくつでも作れるようにするprototypeスコープ

 シングルトンのオブジェクトではなく、呼び出すごとに異なるインスタンスを生成するようなBeanを定義する場合、prototypeスコープの設定を行います。prototypeスコープはステートフルなBeanに利用し、singletonスコープはステートレスなBeanに使用するといった使い分けをします。

リスト9 以前のバージョンでのprototypeスコープBeanのDTD記述書式
<bean id="sample" class="net.kronos_jp.aop.SampleBean"
  singleton="false"/>

リスト10 Spring 2.0でのprototypeスコープBeanのDTD記述書式
<bean id="sample" class="net.kronos_jp.aop.SampleBean"
  scope="prototype"/>

 次ページでは、新しく追加されたWebアプリケーション用のスコープについて実装例を示しながら解説していきます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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