AOP の概念

いくつかの中心的な AOP の概念と用語を定義することから始めましょう。これらの用語は、Spring 固有のものではありません。残念ながら、AOP の用語は特に直感的ではありません。ただし、Spring が独自の用語を使用すると、さらに混乱を招きます。

  • アスペクト: 複数のクラスにまたがる関心事のモジュール化。トランザクション管理は、エンタープライズ Java アプリケーションにおける横断的な問題の好例です。Spring AOP では、アスペクトは通常のクラス ( スキーマベースのアプローチ ) または @Aspect アノテーションが付けられた通常のクラス (@AspectJ スタイル ) を使用して実装されます。

  • ジョインポイント: メソッドの実行や例外の処理など、プログラムの実行中のポイント。Spring AOP では、ジョインポイントは常にメソッドの実行を表します。

  • アドバイス: 特定のジョインポイントでアスペクトによって実行されるアクション。さまざまな種類のアドバイスには、「前後」、「前」、「後」のアドバイスがあります。(アドバイスの種類については後で説明します) Spring を含む多くの AOP フレームワークは、アドバイスをインターセプターとしてモデル化し、ジョインポイントの周囲にインターセプターの チェーン を維持します。

  • ポイントカット: ジョインポイントに一致する述語。アドバイスはポイントカット式に関連付けられ、ポイントカットに一致する任意のジョインポイントで実行されます(たとえば、特定の名前のメソッドの実行)。ポイントカット式と一致するジョインポイントの概念は AOP の中心であり、Spring はデフォルトで AspectJ ポイントカット式言語を使用します。

  • 導入: 型に代わって追加のメソッドまたはフィールドを宣言します。Spring AOP を使用すると、推奨オブジェクトに新しいインターフェース(および対応する実装)を導入できます。例: 導入を使用して、Bean に IsModified インターフェースを実装させ、キャッシングを簡素化できます。(概要は、AspectJ コミュニティでの型間宣言として知られています。)

  • 対象オブジェクト: 1 つまたは複数のアスペクトによってアドバイスされているオブジェクト。「推奨オブジェクト」とも呼ばれます。Spring AOP はランタイムプロキシを使用して実装されるため、このオブジェクトは常にプロキシされたオブジェクトです。

  • AOP プロキシ: アスペクト 契約 (アドバイスメソッドの実行など) を実装するために AOP フレームワークによって作成されるオブジェクト。Spring Framework では、AOP プロキシは JDK 動的プロキシまたは CGLIB プロキシです。

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

Spring AOP には、次の種類のアドバイスが含まれています。

  • Before アドバイス: ジョインポイントの前に実行されるが、例外がスローされない限り、実行フローがジョインポイントに進むことを防ぐ機能がないアドバイス。

  • After returning アドバイス: ジョインポイントが正常に完了した後に実行するアドバイス(たとえば、メソッドが例外をスローせずに戻る場合)。

  • After throwing アドバイス: 例外をスローしてメソッドが終了した場合に実行されるアドバイス。

  • After (finally) アドバイス: ジョインポイントが存在する方法(通常または例外的なリターン)に関係なく実行されるアドバイス。

  • Around アドバイス: メソッド呼び出しなどのジョインポイントを囲むアドバイス。これは最も強力なアドバイスです。Around アドバイスは、メソッド呼び出しの前後にカスタム動作を実行できます。また、ジョインポイントに進むか、独自の戻り値を返すか例外をスローすることにより、推奨されるメソッド実行をショートカットするかを選択する責任もあります。

Around アドバイスは、最も一般的な種類のアドバイスです。Spring AOP は、AspectJ と同様、あらゆる種類のアドバイスを提供するため、必要な動作を実装できる最も強力でないアドバイス型を使用することをお勧めします。例: メソッドの戻り値でキャッシュを更新するだけでよい場合は、around アドバイスよりも after returning アドバイスを実装する方が適切ですが、around アドバイスでも同じことができます。最も具体的なアドバイス型を使用すると、エラーが発生する可能性が低く、シンプルなプログラミングモデルが提供されます。例: 回避アドバイスに使用される JoinPoint で proceed() メソッドを呼び出す必要はないため、呼び出しに失敗することはありません。

すべてのアドバイスパラメーターは静的に型付けされているため、Object 配列ではなく、適切な型(たとえば、メソッド実行からの戻り値の型)のアドバイスパラメーターを操作できます。

ポイントカットと一致するジョインポイントの概念は、AOP の鍵であり、インターセプトのみを提供する古いテクノロジーと区別します。ポイントカットを使用すると、オブジェクト指向の階層とは無関係にアドバイスをターゲットにできます。例: 複数のオブジェクト(サービス層のすべてのビジネスオペレーションなど)にまたがる一連のメソッドに宣言型トランザクション管理を提供するアラウンドアドバイスを適用できます。