作成 2004/8/7
えー、巷で話題のAOPについてメモります。
AOP(Aspect Oriented Program:アスペクト指向プログラム)は、オブジェクト指向と少し違う方法で、ソフトウェアの複雑さの低減や再利用性を向上させるための仕組みです。
オブジェクト指向が継承により、プログラムコードの重複を回避するのに対し、アスペクト指向では、「アスペクト」によりプログラムコードの重複を省きます。
アスペクトの例としてよく使われるのが、ログやトランザクション処理の例です。一般にログの出力コードはプログラム中にあちこち分散します。アスペクト指向を使うと、ログ出力はコード中には記述しません。変わりに、「どこにログを出すか」、「どんなログを出すか」を別に定義します。
どのような処理を行うかのことをアドバイスといいます。プログラム中に割って入って何を行うかということで、ログの例では「どんなログを出すか」にあたります。
ジョインポイントとは、コードのどこでアドバイスの対象にするかというコード中の場所のことをいいます。ログの例では「どこにログを出すか」にあたります。
ジョインポイントの集合のことをポイントカットと言います。ポイントカットでは、 ジョインポイントの集合を条件であらわします。ログの例では、これも「どこにログを出すか」にあたりますが、クラスやメソッドの名前などの条件を示すものがポイントカットです。
元のコードとアスペクトを合体させることをウィーブといいます。元のコードの部分部分にアスペクトだ挿入されていくので、ウィーブ(織り込み)と呼ばれるようです。
現在AOPを行う技術にはいくつかの選択肢があります。
ソースコード中にアスペクトを記述し、アスペクト用のコンパイラで、ウィーブを行います。コンパイルされたコードは、基本的には通常のJavaクラスと変わらないので、実行環境に特別な設定は必要ありません。また、デザインパターンをアスペクトを使って再構築するようなクラス設計をすることも試みられているようです。欠点としては、コンパイルに特別な処理が必要なこと。現状その(コンパイル)パフォーマンスはそれほどよくなく、インクリメンタルビルドとかは辛いこと。アスペクト用の文法を憶えなけらばならないこと、などがあります。
コンパイル時にアスペクトを行う代表例はAspectJです。EclipseなどのIDEではAspectJ用のプラグインも提供されています。
アスペクトはクラスで定義し、ポイントカットをXMLなどの設定ファイルで記述します。
JBossAOP、Spring、Seasarなどが、アスペクトに対応しています。JBossAOPではクラスローダーに割って入りウィーブを行います。SpringやSeasarなどでは、コンテナのファクトリーからオブジェクトを取得する際にウィーブを行います。
アスペクトの実現には、cglib、JavaAssistなどのバイトコードライブラリやJavaリフレクションのダイナミックプロキシなどが利用されます。
上記の実行時にアスペクトを行うためのフレームワークはIoCコンテナと呼ばれます。IoC(Inversion of Control:制御の反転)とは、ソフトウェア開発一般には、いわゆるフレームワークやテンプレートメソッドなどのデザインパターンがソレ(制御の反転:あなたがぼくを呼ぶのよ)を指します。IoCの世界では、微妙にニュアンスが違って、「コンテナ管理のオブジェクト間の関連を指定する方法」を意味するようです。最近は、マーチン・ファウラー氏の呼びかけで、IoCよりDI(Dependency Injection : 依存性の挿入)という言葉を用いることが多くなってきているようです。
IoCを行うコンテナのことをIoC(DI)コンテナと呼ばれます。IoCとAOP自体は直接は関係のないものですが、AOPを実現するための仕組みの一つとしてIoCが用いられます。IoCとAOPは相性がよいわけです。
というわけで、DIコンテナを簡単に使ってみます。
JBossAOP