web-dev-qa-db-ja.com

Spring AOPとAspectJ

Spring AOPは、カスタムJava5アノテーションをフレームワークとして使用するため、セキュリティ、ロギング、トランザクションなどのアプリケーション固有のタスクに最適に使用されるという印象を受けています。しかし、AspectJは賢いデザインパターンのようです。

SpringアプリケーションでSpring AOPとAspectJを使用することのさまざまな長所と短所を強調できる人はいますか?

169
zotherstupidguy

Spring-AOPの長所

  • LTW( load-time weaving )またはAspectJコンパイラを使用する必要がないため、AspectJよりも簡単に使用できます。

  • ProxyパターンとDecoratorパターンを使用します

Spring-AOPの短所

  • これはプロキシベースのAOPであるため、基本的にはメソッド実行ジョインポイントのみを使用できます。
  • 同じクラス内の別のメソッドを呼び出す場合、アスペクトは適用されません。
  • 少しの実行時オーバーヘッドがあります。
  • Spring-AOPは、Springファクトリによって作成されていないものにはアスペクトを追加できません

AspectJの長所

  • これはすべてのジョインポイントをサポートします。これは、何でもできることを意味します。
  • Spring AOPの場合よりも実行時のオーバーヘッドが少なくなります。

AspectJの短所

  • 注意してください。あなたのアスペクトがあなたが織りたいものだけに織り込まれているかどうかを確認してください。
  • AspectJコンパイラで追加のビルドプロセスが必要か、LTW(ロード時ウィービング)をセットアップする必要があります
225
Whiteship

他の人が述べたこととは別に-言い換えると、there are two major differences

  1. 1つは製織のタイプに関連しています。
  2. ジョインポイント定義のもう1つ。

Spring-AOP:dynamic proxy if interface exists or cglib library if direct implementation provided.の概念を使用したプロキシを介した実行時ウィービング

AspectJ:ソースが利用可能な場合はAspectJ Java Tools(ajc compiler)を使用してコンパイルするか、コンパイル後のウィービング(コンパイル済みファイルを使用)でコンパイルします。また、Springでのロード時間ウィービングを有効にすることができます-aspectj定義ファイルが必要で、柔軟性があります。

コンパイル時間ウィービングは、パフォーマンスの利点(場合によって)とjoinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.の利点を提供できます。

21
techzen

追加の注意:高負荷下でのパフォーマンスが重要な場合、Spring AOPよりも9〜35倍高速なAspectJが必要です。 10ns対355nsはあまり聞こえないかもしれませんが、たくさんのアスペクトを使用している人を見てきました。 10Kの価値のある側面。これらの場合、あなたのリクエストは何千もの側面にぶつかります。その場合、そのリクエストにmsを追加しています。

ベンチマーク を参照してください。

18
Joseph Lust

春のユーザーマニュアル は、馬の口から直接多くの情報を提供します。

6.4-使用するAOP宣言スタイルの選択 の章では、両方の長所と短所について説明しているので、これについては説明しません。

段落 6.1.2-Spring AOPの機能と目標 および章 6.2-@Aspectサポート および 6.8-SpringアプリケーションでのAspectJの使用 面白い。

18
elhoim

Spring AOPは、Springフレームワークの重要な部分の1つです。非常に基本的な段階では、SpringフレームワークはIoCとAOPに基づいています。 Springの公式コースには、次のようなスライドがあります。

AOPは、フレームワークの最も重要な部分の1つです。

SpringでAOPがどのように機能するかを理解するための重要なポイントは、Springでアスペクトを記述するときに、Beanがインターフェースを実装する場合はJDKDynamicProxyを使用してオブジェクトのプロキシを構築するフレームワークをインストルメントすることです。インターフェースを実装していません。バージョン3.2より前のSpringを使用している場合は、クラスパスにcglib 2.2が必要であることを忘れないでください。 Spring 3.2以降では、cglib 2.2がコアに含まれていたため、役に立ちません。

Bean作成時のフレームワークは、オブジェクトをラップし、セキュリティ、トランザクション管理、ロギングなどの横断的な関心事の責任を追加するプロキシを作成します。

この方法でのプロキシ作成は、プロキシとして作成されるBeanとメソッドを決定するフレームワークを計測するポイントカット式から開始して適用されます。アドバイスはあなたのコードよりも責任があります。このプロセスでは、ポイントカットはfinalとして宣言されていないパブリックメソッドのみをキャプチャすることに注意してください。

さて、Spring AOPでは、コンテナの起動時にコンテナによってアスペクトの織り込みが実行されますが、AspectJでは、バイトコード変更によるコードのポストコンパイルでこれを実行する必要があります。私の意見では、このため、SpringのアプローチはAspectJよりもシンプルで管理しやすいものです。

一方、Spring AOPでは、実装はコードの変更ではなくプロキシを介して行われるため、AOPのすべての機能を使用することはできません。

AspectJと同様に、SpringAOPでロード時ウィービングを使用できます。春のこの機能は、エージェントと特別な構成@EnabledLoadWeavingまたはXMLで実装されています。名前空間を例として使用できます。ただし、Spring AOPでは、すべてのケースを傍受することはできません。たとえば、newコマンドは、Spring AOPではサポートされていません。

ただし、Spring AOPでは、Spring構成Beanでaspectofファクトリメソッドを使用することで、AspectJの使用から恩恵を受けることができます。

Spring AOPは基本的にコンテナから作成されたプロキシであるため、AOPはSpring Beanにのみ使用できます。 AspectJでは、すべてのBeanでアスペクトを使用できます。比較のもう1つのポイントは、デバッグとコードの動作の予測可能性です。 Spring AOPでは、ジョブはすべてJavaコンパイラーから実行され、アスペクトはSpring Beanのプロキシを作成するための非常にクールな方法です。 AspectJでコードを変更する場合、より多くのコンパイルが必要であり、アスペクトがどこに織り込まれているかを理解するのは困難です。 Springでウィービングをシャットダウンすることも簡単です。Springを使用すると、構成からアスペクトを削除し、再起動して機能します。 AspectJでは、コードを再コンパイルする必要があります!

SpringはAspectJのすべてのオプションをサポートしていないため、ロード時のウィービングでは、AspectJはSpringよりも柔軟です。しかし、私の意見では、Beanの作成プロセスを変更する場合、新しいオペレーターの動作を変更するアスペクトのロード時のウィービングではなく、ファクトリーでカスタムログインを管理する方が良い方法です。

このAspectJとSpring AOPのパノラマが、2つのポーションの違いを理解するのに役立つことを願っています

12
Valerio Vaudi

アスペクトがミッションクリティカルであるかどうか、およびコードが展開されている場所を考慮することが重要です。 Spring AOPは、ロード時のウィービングに依存していることを意味します。これは織り込みに失敗する可能性があり、私の経験では、ログに記録されたエラーが存在する可能性がありますが、アスペクトコードなしでアプリケーションが実行されるのを防ぐことはできません[このように設定できるという警告を追加しますこれはそうではありませんが、私はそれを個人的に認識していません]。コンパイル時の製織はこれを回避します。

さらに、AspectJをaspectj-maven-pluginと組み合わせて使用​​すると、CI環境でアスペクトに対してユニットテストを実行でき、ビルドされたアーティファクトがテストされ、正しく織り込まれていることを確信できます。 Springによる単体テストを確実に作成できますが、LTWが失敗した場合にテストされたコードがデプロイされたコードになるという保証はありません。

別の考慮事項は、サーバー/アプリケーションの起動の成功または失敗を直接監視できる環境でアプリケーションをホストしているのか、監督下にない環境でアプリケーションが展開されているのか[たとえば、クライアントによってホストされている場所]。繰り返しますが、これは時間織りをコンパイルする方法を示します。

5年前、作業が簡単でIDEを噛みにくいという単純な理由から、Springで構成されたAOPの方がずっと好きでした。ただし、コンピューティング能力と利用可能なメモリが増加するにつれて、これは問題がはるかに少なくなり、上記で説明した理由に基づいて、作業環境でaspectj-maven-pluginを使用したCTWがより適切な選択肢になりました。

0
kcampbell

この 記事 には、トピックに関する適切な説明もあります。

Spring AOPとAspectJには異なる目標があります。

Spring AOPは、プログラマが直面する最も一般的な問題を解決するために、Spring IoC全体にシンプルなAOP実装を提供することを目的としています。

一方、AspectJは、完全なAOPソリューションを提供することを目的とするオリジナルのAOPテクノロジーです。

0
gce