本記事は2005年に執筆されたものです。Spring、DI、AOP全般の最新情報は@IT Java Solutuionのカテゴリ「DI×AOP(Spring/Seasarなど)」をご参照ください。
前回「第2回 Springフレームワークの思想とAOP」ではSpringフレームワークが提供するAOPについて説明しました。今回は実際にコードを読みながら、AOPについて理解します。
SpringフレームワークのAOPは、AspectJのような特殊な言語や環境を必要としません。標準のJavaの機能だけで実現されています。そのためライブラリをいくつか設定するだけでDIコンテナにAOPを導入することができます。
SpringのAOPはDIコンテナで管理されたオブジェクトに対して使用することができます。またAOPによって処理が挿入されたオブジェクトインスタンスは、インターフェイスを介してアクセスされる必要があります。
DIでは、オブジェクト同士の疎結合を実現するためにインターフェイスベースのプログラミングを強く推奨しています。この考え方とインターフェイスベースのプログラミングのメリットなどは、後ほど連載の中で詳しく説明することにします。
ここでは、AOPを使用するためには「インターフェイスと具象クラスを分離しなければならない」ということに注意しておいてください。
SpringAOPを使用するためには、以下のJARファイルにクラスパスを通さなくてはなりません。このJARファイルは、Springフレームワークのアーカイブに含まれています。以下に、AOPサンプルの動作に必要なライブラリを示します。
Jarファイル名 | Springアーカイブ中のディレクトリ | 説明 | |
---|---|---|---|
aopalliance.jar | \lib\aopalliance | AOPを使用するために必要なライブラリ AOPアライアンス(http://aopalliance.sourceforge.net/)とはAOPに関心のあるオープンソースの連合プロジェクトである。SpringはAopAllianceが定義するインターフェイスに準拠している |
|
jakarta-oro.jar | \lib\oro | Jakartaが提供する正規表現を使用するためのライブラリ | |
今回のサンプルでは、「HelloWorld」という文字列を標準出力に書き出すだけのクラスに対してアスペクトとなる処理を挿入し、メソッドの実行前後で別の文字列を出力します。AOPを使うことで既存ロジックにまったく影響を与えずに処理を挿入できることを確認します。
図1は、サンプルで作成するオブジェクトの関連を表したものです。SpringAOPによって「Beanインターフェイスオブジェクト」を取得すると、インターセプタークラスで定義した処理を挿入した具象オブジェクトが取得できます。
今回のAOPサンプルで作成するソースを以下に示します。
クラス名 | 役割 | 目的 | |
---|---|---|---|
SpringTest | サンプル起動クライアント | DIコンテナを呼び出して、IHelloWorldBeanオブジェクトを生成 IHelloWorldBean のhelloworld()メソッドを実行します |
|
IHelloWorldBean | Beanインターフェイス | helloworld()メソッドを持つインターフェイス | |
HelloWorldBeanImpl | Bean実装 | IHelloWorldBeanを実装した具象クラス。helloworld()メソッドで標準出力に「Helloworld」と出力します | |
MyMethodIntercepter | インターセプター | 標準出力に対して、「メソッド実行前」と「メソッド実行後」を表示します | |
applicationContext.xml | DI設定ファイル | DIコンテナの設定を行います。IHelloWorldBeanオブジェクトにMyMethodIntercepterの処理を挿入する処理はこのファイルで指定されます | |
RegexpMethodPointcutAdvisor | アドバイザー | Springフレームワークで定義済みのアドバイザー正規表現を使用したポイントカットの指定が可能です | |
Copyright © ITmedia, Inc. All Rights Reserved.