- 2009-04-25 (土)
- 技術
SpringやSeasar2などのFrameworkを使っているとDIやAOPを簡単に実現できますが、このAOPを自前で手軽に書くにはどうやるのかな〜と思って調べてみた。
AOPとは[ThinkIT] 第5回:AOPとは何か (1/4)あたりを読むと分かりますが、ある処理を実行する前や後に追加で処理を入れることをいい、しかも実装クラスには手をつけずに外から処理を追加するように見せるのが特徴です。
ではシンプルにAOPを実現するコードを書いてみます。
今回はServiceというInterfaceを実装したServiceImplに文字を出力する処理だけを記述し、その前後にロギングの処理をAOPで織り込んでおきます。
Main.java
まずはメインとなる実行クラスを作ります。
このクラスで重要なのはProxy.newProxyInstanceというメソッドを使ってプロキシクラスを取得していることです。
たとえばServiceImplを普通にnewしてしまうと、純粋に文字を出力する処理しか存在しませんがこれではAOPを入れる隙間がありません。
なのでプロキシクラスを経由してServiceImplの処理を呼んでもらうようにします。
それがProxyというクラスの役目になります。
Proxy.newProxyInstanceメソッドの引数は
- ClassLoader
- プロキシクラスを定義するクラスローダ
- Class<?>[]
- プロキシクラスが実装するインタフェースのリスト
- InvocationHandler
- メソッド呼び出しのディスパッチ先の呼び出しハンドラ
になります。
第3引数に渡すInvocationHandlerに渡すクラスが実際のAOPとして折り込みたい処理を実装したクラスになります。
詳細は後で紹介します。
■参考リンク
Proxy (Java 2 Platform SE 5.0)
Service.java
普通にインターフェースです。
ServiceImpl.java
文字出力処理を実装しているクラスになります。
文字を出力し、returnとして出力した文字を返しています。
Intercepter.java
プロキシを作成するためにまずはInvocationHandlerインターフェースをimplementする必要があります。
そしてService.print()が呼び出されるとこのクラスのinvokeがディスパッチされます。
invokeメソッドの引数は
- Object proxy
- プロキシクラスの参照
- Method
- 呼び出されたメソッドのMethodオブジェクト
- Object[]
- 呼び出されたメソッドの引数配列
になっています。
ひとつ気をつけたいのはmethod.invokeを呼び出すさいの第1引数はproxy変数ではないことです。
proxy変数にはプロキシクラスの参照が入っているので、もしproxy変数をmethod.invokeに渡してしまうと無限にループしてしまいます。
なのでこのクラスではコンストラクタに実装クラスを渡すようにしています。
そして実装クラスをオブジェクトとしてmethodを呼び出します。
■参考リンク
InvocationHandler
これらを実装してMain.javaを実行するとprintの前と後にログ処理が追加され文字がコンソールに出力されます。
ちょっぴり面倒ですが、Intercepterクラスをしっかり作ればもっといろんあ織り込み処理が作れそうですね。
JavaScriptでAOPを実現してみる
では次にJavaScriptで↑で説明したようなAOPを作ってみたいと思います。
名前を一緒にしたほうが分かりやすいのでProxy.newProxyInstanceという関数を作り、この関数からプロキシオブジェクトを取得します。
実際にはオブジェクトを作り直しているだけですが、JavaのProxyクラスも同じようなことをやっているのでそこまで違いはないと思います。
コードは以下のとおり。
まとめ
JavaScriptでAOPを使うことは今のところないとは思いますが、いずれクライアントサイド・ストレージを使ってブラウザ側のDBを使うときにトランザクションをAOPを使って織り込みたいといった要望がでてきたときに便利かもしれません。
trycatchで囲ったりしてコネクション繋いだりトランザクション貼ったりするのはコード量も増えますし、結構面倒だったりもしますしね。
- Newer: PerlのMVCフレームワークCatalystをインストールしてみた
- Older: MacBook Proの熱を下げる方法
Comments:0
Trackback:0
- TrackBack URL for this entry
- http://hisasann.com/cgi-bin/mt/mt-tb.cgi/1185
- Listed below are links to weblogs that reference
- 最もシンプルにJavaのAOPを書いてみる→そしてJavaScriptへ from HouseTect, JavaScript Blog


