1. ホーム
  2. spring

[解決済み] Spring AOP: JoinPointとPointCutの違いは何ですか?

2023-01-13 09:46:44

質問

アスペクト指向プログラミングの概念とSpring AOPを学んでいます。私はPointcutとJoinpointの違いを理解できていません。私にとってどちらも同じように思えます。Pointcutはアドバイスを適用する場所であり、Joinpointもアドバイスを適用する場所だと思います。では、何が違うのでしょうか?

ポイントカットの例としては、次のようなものがあります。

@Pointcut("execution(* * getName()")

ジョインポイントの例としては、どのようなものがありますか?

どのように解決するのですか?

ジョインポイントです。 ジョインポイントは 候補 の点です。 プログラムの実行 で、アスペクトをプラグインすることができます。このポイントは、呼び出されるメソッド、スローされる例外、あるいは変更されるフィールドである可能性があります。これらは、アスペクトのコードが新しい動作を追加するためにアプリケーションの通常のフローに挿入できるポイントです。

アドバイスです。 これは、ポイントで指定されたジョインポイントで実行するアクションを表す、システム全体の懸念に対するAPI呼び出しを含むオブジェクトです。

ポイントカットです。 ポイントカットは、関連するアドバイスが適用されるべきジョインポイントを定義します。AdviceはAOPフレームワークでサポートされている任意の結合点で適用することができます。もちろん、すべてのアスペクトをすべての可能なジョインポイントで適用したいわけではありません。ポイントカットを使用すると、アドバイスを適用したい場所を指定することができます。多くの場合、明示的なクラス名とメソッド名を使用して、または一致するクラス名とメソッド名のパターンを定義する正規表現を通じて、これらのポイントカットを指定します。いくつかのAOPフレームワークでは、メソッドパラメータの値などの実行時の決定に基づいてアドバイスを適用するかどうかを決定する動的なポイントカットを作成することができます。

次の画像は、Advice、PointCut、Joinpointsを理解するのに役立ちます。

ソース

レストランに例えて説明します。 ソース:@Victor

レストランに出かけると、メニューを見て、いくつかの選択肢から選ぶことができます。メニューの中から1つ、または複数の商品を注文することができます。しかし、実際に注文するまでは、それらは「食事をする機会」に過ぎません。注文して、ウェイターがテーブルに運んできたら、それは食事なのです。

ジョインポイントはメニューのオプションで、ポイントカットは選択するアイテムです。

ジョインポイントはアスペクトを適用するためのコード内の機会です...単なる機会です。その機会を利用して、1つまたは複数のJoinpointを選択し、それらにアスペクトを適用すると、Pointcutが得られます。

出典 Wiki :

<ブロッククオート

A ジョインポイント とは、プログラムの制御フローの中で、制御フローが を経由して到着することができます。 2つの異なるパス (IMO : そのために を呼び出す理由です)。

アドバイス 他の関数を変更する関数のクラスを記述しています。

A ポイントカット は、一致する P のパターンであり、ジョインポイントの集合である。