Google
 
Web andore.com
Powered by SmartDoc

7. AspectJとの統合(Ver 1.2.7)

7.1 概要

SpringのプロキシベースのAOPフレームワークは多くの汎用的なミドルウェアやアプリケーション特有の問題にうまく適合できる。しかしながら、もっと強力なAOPソリューションが必要になことがある。例えば、クラスにフィールドを追加したり、Spring IoCコンテナによって生成されたものではない粒度の細かいオブジェクトにアドバイスする必要がある場合だ。

そのような場合は、我々はAspectJを使うのをお勧めする。なので、バージョン1.1でSpringは強力なAspectJとの統合を提供する。

7.2 SpringのIoCを使ってAspectJのアスペクトを設定する

Spring/AspectJの統合で最も重要な点は、依存性注入を用いて、SpringにAspectJのアスペクトを設定できるようにすることだ。これにより、オブジェクトに対してのと同じ利点をアスペクトにもたらす。例えばこのようなものだ。

AspectJのアスペクトは、SetterインジェクションのJavaBeanプロパティのエクスポーズやBeanFactoryAwareのようなSpringのライフサイクルインタフェースの実装さえも可能だ。

AspectJのアスペクトではコンストラクタインジェクションやメソッドインジェクションは使えない点には注意してほしい。この制限は、アスペクトではオブジェクトのコンストラクタのように起動できるコンストラクタがないことによるものだ。

7.2.1 「シングルトン」アスペクト

ほとんどのケースでは、AspectJのアスペクトはクラスローダごとにインスタンスが1つしかないシングルトンである。この1つしかないインスタンスが、複数のオブジェクトインスタンスに対するアドバイスを担う。

アスペクトには呼び出し可能なコンストラクタがないので、SpringのIoCコンテナではアスペクトをインスタンス化することができない。だが、AspectJで全てのアスペクトに定義されているstaticなaspectOf()メソッドを使ってアスペクトへの参照を取得することは可能であり、そのアスペクトに依存性を注入することも可能だ。

7.2.1.1 例

セキュリティマネージャに依存するセキュリティアスペクトを考えてみよう。このアスペクトはAccountクラスにあるbalanceというインスタンス変数の値の変化の全てに適用される。(Spring AOPではこれは同じ方法では実現することができなかった)

このアスペクト用のAspectJのコード(Spring/AspectJのサンプルの1つ)を下記に示す。SecurityManagerインタフェースの依存性がJavaBeanプロパティで表現されている点に注意してほしい。

public aspect BalanceChangeSecurityAspect {

   private SecurityManager securityManager;

   public void setSecurityManager(SecurityManager securityManager) {
      this.securityManager = securityManager;
   }

   private pointcut balanceChanged() : 
      set(int Account.balance);

   before() : balanceChanged() {
      this.securityManager.checkAuthorizedToModify();
   }
}

このアスペクトを通常のクラスと同じ方法で設定する。これはプロパティへの参照を設定するのと同じ方法であることに注意してほしい。aspectOf()staticメソッドを使って生成されたアスペクトが欲しいことを指定するのにfactory-method属性を使わないといけない。実際は、これは生成ではなく配置なのだが、Springコンテナではこれをサポートしていない。

<bean id="securityAspect" 
class="org.springframework.samples.aspectj.bank.BalanceChangeSecurityAspect"
   factory-method="aspectOf">
   <property name="securityManager" ref="securityManager"/>
</bean>

このアスペクトをターゲットとするSpringの設定は何もする必要はない。このアスペクトがどこに適用されるかについてのコントロールを行うAspectJのコードにポイントカット情報が含まれている。従って、SpringのIoCコンテナによって管理されていないオブジェクトにも適用することが可能になっている。

7.2.1.2 順序の問題

to be completed

7.2.2 非シングルトンなアスペクト

** Complete material on pertarget etc.

7.2.3 Gotchas

to be completed

- Singleton issue

7.3 AspectJのポイントカットを使ってSpringのアドバイスを指定する

Springの今後のリリースで、Springのアドバイスをターゲットに指定するのに、AspectJのポイントカット表現をSpringのXMLビーン定義ファイルやその他のビーン定義ファイルで利用できるようにする予定でいる。これにより、強力なAspectJのポイントカットモデルをSpringのプロキシベースAOPフレームワークに適用することができるようになる。これはpure javaで動作し、AspectJコンパイラを必要としないようにするつもりだ。メソッド起動に関連するAspectJポイントカットのサブセットだけが利用可能になる。

この機能は、Springでポイントカットを表現するための言語をつくるという以前の計画を置き換えるものである。

7.4 AspectJ用のSpringアスペクト

Springの今後のリリースで、AspectJのアスペクトとして宣言的トランザクション管理サービスのようなSpringサービスをいくつか同梱する予定だ。これにより、AspectJユーザがSpringのAOPフレームワークに依存せず、潜在的に、SpringのIoCコンテナにも依存せずに使うことができるようになると思う。

この機能はおそらく、SpringのユーザよりもAspectJユーザの方が関心があるだろう。