引入

引入 (在 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")
© . This site is unofficial and not affiliated with VMware.