このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Framework 6.2.3 を使用してください! |
導入
イントロダクション(AspectJ では型間宣言として知られています)は、アスペクトがアドバイスされたオブジェクトが特定のインターフェースを実装することを宣言し、それらのオブジェクトに代わってそのインターフェースの実装を提供できるようにします。
@DeclareParents
アノテーションを使用して導入を行うことができます。このアノテーションは、一致する型に新しい親があることを宣言するために使用されます (名前の由来)。例: UsageTracked
という名前のインターフェースと、そのインターフェースの DefaultUsageTracked
という名前の実装がある場合、次のアスペクトは、サービスインターフェースのすべての実装が UsageTracked
インターフェースも実装することを宣言します (たとえば、JMX 経由の統計の場合)。
Java
Kotlin
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xyz.service.*+", defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("execution(* com.xyz..service.*.*(..)) && this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
@Aspect
class UsageTracking {
companion object {
@DeclareParents(value = "com.xyz.service.*+",
defaultImpl = DefaultUsageTracked::class)
lateinit var mixin: UsageTracked
}
@Before("execution(* com.xyz..service.*.*(..)) && this(usageTracked)")
fun recordUsage(usageTracked: UsageTracked) {
usageTracked.incrementUseCount()
}
}
実装されるインターフェースは、アノテーション付きフィールドの型によって決まります。@DeclareParents
アノテーションの value
属性は、AspectJ 型のパターンです。一致する型の Bean は、UsageTracked
インターフェースを実装します。前の例の前のアドバイスでは、サービス Bean を UsageTracked
インターフェースの実装として直接使用できることに注意してください。Bean にプログラムでアクセスする場合、次のように記述します。
Java
Kotlin
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean<UsageTracked>("myService")