Spring AOP と AspectJ
-
05-07-2019 - |
質問
Spring AOP は、セキュリティ、ロギング、トランザクションなどのアプリケーション固有のタスクに最適に使用されるという印象を受けています。カスタム Java5 アノテーションをフレームワークとして使用するためです。ただし、デザインパターンに関しては AspectJ の方が親しみやすいようです。
Spring アプリケーションで Spring AOP と AspectJ を使用する場合のさまざまな長所と短所を強調できる人はいますか?
解決
Spring-AOP Pros
-
LTW(ロード時ウィーブ)またはAspectJコンパイラ。
-
プロキシパターンとデコレータを使用します パターン
Spring-AOPの短所
- これはプロキシベースのAOPであるため、基本的にはメソッド実行ジョインポイントのみを使用できます。
- 同じクラス内の別のメソッドを呼び出す場合、アスペクトは適用されません。
- 実行時のオーバーヘッドが少しあります。
- Spring-AOPは、Springファクトリによって作成されていないものにはアスペクトを追加できません
AspectJ Pros
- これはすべてのジョインポイントをサポートします。これは、何でもできることを意味します。
- Spring AOPよりも実行時のオーバーヘッドが少ない。
AspectJの短所
- 注意してください。あなたのアスペクトがあなたが織りたいものだけに織り込まれているかどうかを確認してください。
- AspectJコンパイラで追加のビルドプロセスが必要か、LTW(ロード時ウィービング)をセットアップする必要があります
他のヒント
他の人が述べたこととは別に-言い換えれば、 2つの大きな違いがあります
:
- 1つは製織のタイプに関連しています。
- ジョインポイント定義のもう1つ。
Spring-AOP: インターフェースが存在する場合は動的プロキシー、直接実装が提供されている場合はcglibライブラリーの概念を使用して、プロキシーを介した実行時の織り込み
AspectJ:ソースが利用可能な場合は AspectJ Java Tools(ajcコンパイラ)
を使用してコンパイルするか、コンパイル後のウィービング(コンパイル済みファイルを使用)。また、Springでのロード時間ウィービングを有効にすることができます-それは aspectj
定義ファイルを必要とし、柔軟性を提供します。
コンパイル時のウィービングは、パフォーマンスのメリットを提供できます(場合によって)。また、Spring-aopの joinpoint定義は、AspectJには当てはまらないメソッド定義のみに制限されます。
Springユーザーマニュアルは、馬の口から直接の情報。
の章-どのAOP宣言を選択する使用するスタイルは、両方の長所と短所について説明しているので、あなたのために死んでいます。
段落 6.1。 2-春のAOP機能と目標&章 6.2-@Aspectサポートおよび 6.8-SpringアプリケーションでのAspectJの使用は特に興味深いはずです。
追加の注意:高負荷下でのパフォーマンスが重要な場合、AspectJはSpring AOPよりも9〜35倍高速です。 10ns対355nsはあまり聞こえないかもしれませんが、多くのアスペクトを使用している人を見てきました。 10Kの価値のある側面。これらの場合、リクエストは数千の側面にぶつかる可能性があります。その場合、そのリクエストにmsを追加します。
ベンチマークを参照してください。
Spring AOPは、Springフレームワークの重要な部分の1つです。非常に基本的な段階では、SpringフレームワークはIoCとAOPに基づいています。 Springの公式コースには、次のようなスライドがあります。
AOPはフレームワークの最も重要な部分の1つです。
SpringでAOPがどのように機能するかを理解するための重要な点は、Springでアスペクトを記述するとき、Beanがインターフェイスを実装する場合、 JDKDynamicProxy
でオブジェクトのプロキシを構築するフレームワークを装備することですBeanがインターフェースを実装していない場合は、CGLIB経由で。バージョン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では、すべてのケースを傍受することはできません。たとえば、Spring AOPでは new
コマンドはサポートされていません。
ただし、Spring AOPでは、Spring構成Beanで aspectof
ファクトリメソッドを使用することで、AspectJを使用することでメリットが得られます。
Spring AOPは基本的にコンテナから作成されたプロキシであるため、AOPはSpring Beanにのみ使用できます。 AspectJでは、すべてのBeanでアスペクトを使用できます。比較のもう1つのポイントは、デバッグとコードの動作の予測可能性です。 Spring AOPでは、ジョブはすべてJavaコンパイラから実行され、アスペクトはSpring Beanのプロキシを作成する非常にクールな方法です。 AspectJでコードを変更する場合、より多くのコンパイルが必要であり、アスペクトがどこに織り込まれているかを理解するのは困難です。 Springでウィービングをシャットダウンすることも簡単です。Springを使用すると、構成からアスペクトを削除し、再起動して機能します。 AspectJでは、コードを再コンパイルする必要があります!
ロード時のウィービングでは、AspectJのすべてのオプションをSpringがサポートしていないため、AspectJはSpringよりも柔軟性があります。しかし、私の意見では、Beanの作成プロセスを変更したい場合、新しいオペレーターの動作を変更するアスペクトのロード時のウィービングではなく、ファクトリーでカスタムログインを管理する方が良い方法です。
AspectJとSpring AOPのこのパノラマが、2つのポーションの違いを理解するのに役立つことを願っています
あなたの側面がミッションクリティカルになるかどうか、そしてあなたのコードがどこにデプロイされるかを考慮することが重要です。Spring AOP は、ロード時間ウィービングに依存していることを意味します。これはウィーブに失敗する可能性があり、私の経験では、ログに記録されたエラーが存在する可能性がありますが、アスペクト コードなしでアプリケーションを実行することは妨げられません。 [これに当てはまらないように設定できる可能性があることを付け加えておきます。でも個人的には気づいていない]。コンパイル時のウィービングはこれを回避します。
さらに、AspectJ をspectj-maven-plugin と組み合わせて使用すると、CI 環境でアスペクトに対して単体テストを実行でき、構築されたアーティファクトがテストされ、正しく織り込まれたことを確信できます。確かに Spring 駆動の単体テストを作成することはできますが、LTW が失敗した場合にデプロイされたコードがテストされたものであるという保証はありません。
もう 1 つの考慮事項は、サーバー/アプリケーションの起動の成功または失敗を直接監視できる環境でアプリケーションをホストしているかどうか、またはアプリケーションが管理下にない環境にデプロイされているかどうかです。クライアントによってホストされている場合]。繰り返しますが、これはコンパイルタイムウィービングの方法を示します。
5 年前、私は Spring 構成の AOP をもっと支持していました。その理由は、AOP の方が操作が簡単で、IDE を壊す可能性が低いという単純な理由からです。ただし、コンピューティング能力と利用可能なメモリが増加するにつれて、これは問題ではなくなりました。上で概説した理由に基づいて、私の作業環境では、spectj-maven-plugin を使用した CTW がより良い選択肢になりました。
この記事には、トピックに関する適切な説明があります。
Spring AOPとAspectJの目標は異なります。
Spring AOPは、Spring全体でシンプルなAOP実装を提供することを目的としています プログラマが直面する最も一般的な問題を解決するIoC。
一方、AspectJはオリジナルのAOPテクノロジーであり、 完全なAOPソリューションを提供します。