アスペクトのインスタンス化モデル
これは高度なトピックです。AOP を始めたばかりの場合は、後まで安全にスキップできます。 |
デフォルトでは、アプリケーションコンテキスト内に各アスペクトのインスタンスが 1 つずつ存在します。AspectJ はこれをシングルトンインスタンス化モデルと呼びます。代替ライフサイクルを使用してアスペクトを定義することができます。Spring は AspectJ の perthis
、pertarget
、pertypewithin
インスタンス化モデルをサポートします。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 つのアスペクトインスタンスを作成します。