引入

引入 (在 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.