引介
引介 (在 AspectJ 中稱為 inter-type declarations) 使切面能夠宣告被建議的物件實作給定的介面,並代表這些物件提供該介面的實作。
您可以使用 @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
介面。請注意,在前面範例的 before 建議中,服務 Bean 可以直接用作 UsageTracked
介面的實作。如果以程式化方式存取 Bean,您將編寫以下內容
-
Java
-
Kotlin
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean<UsageTracked>("myService")