« cfcUnit | メイン | AOPの実装 »

ColdSpring によるAOP(Aspect Oriented Programming)

ColdSpring のDIコンテナとセットで、AOPというものが解説されることがある。
これも、たくさん記述があるので、それを読んでみても、何がどう便利でどう簡単なのかが、ピンと来ない。
というわけで、実践。

ColdSpring AOP Tutorial - Part Oneとか、ColdSpring ドキュメントや、ColdSpring のサンプルからちょっとコードを拝借。

ログを書き出す機能を、これまでのアプリケーションに、AOP手法で実装してみる。

とりあえず、どれぐらい簡単なのかを確認するために、ログ機能を利用するための諸設定などは、すでに行われているものとすれば、実に、簡単である。

やろうとしていることは、shopping.model.CartProcess コンポーネントの関数を実行するたびに、ログを書き出すようにしたい。
ということで、それには、ColdSpring.xml の中の、

 <bean id="shopping" class="shopping.model.CartProcess" autowire="byType" />

これを


 <bean id="cartProcessTarget" class="shopping.model.CartProcess" autowire="byType" />
 
 <bean id="shopping" class="coldspring.aop.framework.ProxyFactoryBean">
  <property name="target">
   <ref bean="cartProcessTarget" />
  </property>
  <property name="interceptorNames">
   <list>
    <value>loggingAdvisor</value>
   </list>
  </property>
 </bean>

とするだけである。
が、実際、簡単なんだと思えるまで、結構時間がかかった。

2段階でコンポーネントのインスタンスを取得していることになる。
こうして得られる shopping インスタンスは、coldspring.aop.framework.ProxyFactoryBean ではなく、
あたかも shopping.model.CartProcess そのもののように、扱うことができる。

そして、shopping 上の関数を利用すると、ログ書き出しが機能してしまうのである。
既存の shopping.model.CartProcess のコードを書き換えることなく、機能追加を実装できてしまった。

いやいや、ログを取る場合は、もっと細かいレベルで、見たいのではないかと。
例えば、shopping.model.CartProcess の関数は、「カートに商品を入れる」というものであり、
このログ機能が処理されるタイミングは、shopping.model.CartProcess の関数が実行される前、後、その両方、
そして、エラーが発生した場合で設定できる。
既存の関数にログをはき出す機能を付けても、それでは、たいした効果は期待できない。

AOPとは、再利用可能でシンプルな見やすいプログラムを作ることが目的の一つになっている。
例えば、データベースに対して、引数で与えたSQL文を発行するだけというような、再利用できる低レベルでの関数であれば、
その関数の前後などで、ログを書き出すことは、意味を持ってくるのだろう。

また、ログに限らず、AOPは、トランザクション処理や、キャッシュ処理、権限チェック処理などが利用例としてあげられており、どのようなものを実装するかで、意義は変わってくるのだろう。

トラックバック

このエントリーのトラックバックURL:
http://www.schwarzmond.info/mt/mt-tb.cgi/51

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年04月30日 10:34に投稿されたエントリーのページです。

ひとつ前の投稿は「cfcUnit」です。

次の投稿は「AOPの実装」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。