アスペクトのインスタンス化モデル

これは高度なトピックです。AOP を始めたばかりの場合は、後まで安全にスキップできます。

デフォルトでは、アプリケーションコンテキスト内に各アスペクトのインスタンスが 1 つずつ存在します。AspectJ はこれをシングルトンインスタンス化モデルと呼びます。代替ライフサイクルを使用してアスペクトを定義することができます。Spring は AspectJ の perthispertargetpertypewithin インスタンス化モデルをサポートします。percflow および percflowbelow は現在サポートされていません。

@Aspect アノテーションで perthis 節を指定することにより、perthis アスペクトを宣言できます。次の例を考えてみましょう。

  • Java

  • Kotlin

@Aspect("perthis(execution(* com.xyz..service.*.*(..)))")
public class MyAspect {

	private int someState;

	@Before("execution(* com.xyz..service.*.*(..))")
	public void recordServiceUsage() {
		// ...
	}
}
@Aspect("perthis(execution(* com.xyz..service.*.*(..)))")
class MyAspect {

	private val someState: Int = 0

	@Before("execution(* com.xyz..service.*.*(..))")
	fun recordServiceUsage() {
		// ...
	}
}

上記の例では、perthis 句の効果として、ビジネスサービスを実行する一意のサービスオブジェクトごとに 1 つのアスペクトインスタンスが作成されます(各一意のオブジェクトは、ポイントカット式と一致するジョインポイントで this にバインドされます)。アスペクトインスタンスは、サービスオブジェクトでメソッドが初めて呼び出されたときに作成されます。サービスオブジェクトがスコープから外れると、アスペクトはスコープから外れます。アスペクトインスタンスが作成される前は、そのインスタンス内のアドバイスは実行されません。アスペクトインスタンスが作成されるとすぐに、その中で宣言されたアドバイスは、一致したジョインポイントで実行されますが、サービスオブジェクトがこのアスペクトに関連付けられている場合のみです。per 句の詳細については、AspectJ プログラミングガイドを参照してください。

pertarget インスタンス化モデルは perthis とまったく同じように機能しますが、一致するジョインポイントで一意のターゲットオブジェクトごとに 1 つのアスペクトインスタンスを作成します。