前述(リスト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方式のポイントカットの指定式です。このポイントカット記法では、柔軟なポイントカットが記述できるように、いくつかの構文が用意されています。以下でこの構文を少しだけ解説します。
以下(表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関連のドキュメント】をご参照ください。
以前のバージョンのSpringでは、コンテナレベルでサポートしているスコープはsingletonとprototypeの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を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" |
リスト8 Spring 2.0でのsingletonスコープBeanのDTD記述書式 |
<bean id="sample" class="net.kronos_jp.aop.SampleBean" |
シングルトンのオブジェクトではなく、呼び出すごとに異なるインスタンスを生成するようなBeanを定義する場合、prototypeスコープの設定を行います。prototypeスコープはステートフルなBeanに利用し、singletonスコープはステートレスなBeanに使用するといった使い分けをします。
リスト9 以前のバージョンでのprototypeスコープBeanのDTD記述書式 |
<bean id="sample" class="net.kronos_jp.aop.SampleBean" |
リスト10 Spring 2.0でのprototypeスコープBeanのDTD記述書式 |
<bean id="sample" class="net.kronos_jp.aop.SampleBean" |
次ページでは、新しく追加されたWebアプリケーション用のスコープについて実装例を示しながら解説していきます。
Copyright © ITmedia, Inc. All Rights Reserved.