web-dev-qa-db-ja.com

AspectJを使用したSpringAOP:ロードタイムウィービング

AspectJベースのSpringAOPを使用している場合、ロードタイムウィービングを使用するようにアスペクトを構成する必要がありますか?または、AspectJベースのアプローチを使用する場合、Spring AOPはランタイム/コンパイル時のウィービングもサポートしますか?

8
Shane

SpringAOPはプロキシベースです。特に設定がない限り、SpringAOPはランタイムウィービングを実行します。

ウィービング:アスペクトを他のアプリケーションタイプまたはオブジェクトとリンクして、アドバイスされたオブジェクトを作成します。これは、コンパイル時(たとえば、AspectJコンパイラーを使用)、ロード時、または実行時に実行できます。 Spring AOPは、他の純粋なJava AOPフレームワークと同様に、実行時にウィービングを実行します。

ソース: http://docs.spring.io/spring/docs/4.0.1.RELEASE/spring-framework-reference/htmlsingle/#aop-introduction-defn


ただし、ロード時のウィービングを行うようにSpringを設定することはできます。これを行う方法については、Springのドキュメントを確認してください: http://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/htmlsingle/#aop-aj-ltw

特に、Java Configクラスで@EnableLoadTimeWeavingを使用します。セットアップは非常に簡単で、@Aspectクラスは変更されません。

開発者は、起動スクリプトなどのデプロイメント構成を通常担当する管理者に頼るのではなく、アプリケーションコンテキストを形成する1つ以上のファイルを変更するだけで、ロード時のウィービングが可能になります。

8
Angad

SpringAOPとAspectJを混同しないように注意する必要があると思います。

  • Singh101が述べたように、Spring AOPはプロキシベースであり、より正確にはJava SE動的プロキシ(インターフェイスの場合)またはCGLIBプロキシ(クラスの場合)に基づいています。AspectJ構文のサブセットを使用し、基本的にメソッド実行ポイントカットに限定された一種の「AOPlite」アプローチであり、メソッド呼び出し、クラスメンバーの設定/取得、コンストラクター呼び出し/実行などの多くのAspectJポイントカットタイプが欠落しています。技術的にはAspectJとは大きく異なり、常にランタイムオーバーヘッドが発生します。プロキシアプローチ(呼び出し間接)のため。さらに、Beanクラスの外部から呼び出されるSpring Beanメソッドに制限されます。つまり、Beanが独自のメソッドの1つを呼び出すと、機能しません(対応するメソッドを経由しないため)。プロキシ)であり、Spring Bean以外のクラス(通常のPOJO)でも機能しません。
  • 一方、AspectJは、プロキシにもSpringフレームワークにも依存しない本格的なAOPフレームワークです。ただし、Springアプリケーションに簡単に含めることができます。独自のコンパイラ(Javaコンパイラ)のスーパーセット)を介してバイトコードを直接生成するか、既存のバイトコードをインストルメント化することで機能します。AspectJは、コンパイル時(ランタイムオーバーヘッドなし)または実行中に使用できます。クラスローディング(ロード時間ウィービング、LTW)。LTWはアプリケーションの起動時に少しオーバーヘッドがありますが(ただし、Spring AOPにも同じことが当てはまります)、プロキシが含まれていないため、どちらのAspectJウィービングアプローチにも呼び出しの間接化によるランタイムオーバーヘッドはありません。
  • AOPに関するSpringマニュアルの章では、うまく説明されています 完全なAspectJをSpringに統合する方法 Spring AOPが十分に強力でないか、単に遅すぎる場合。
15
kriegaex