对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

介绍

简介(在 AspectJ 中称为类型间声明)使切面能够声明建议对象实现给定接口,并代表这些对象提供该接口的实现。spring-doc.cadn.net.cn

您可以使用@DeclareParents注解。 这个注解用于声明匹配类型有一个新的父级(因此得名)。 例如 给定一个名为UsageTracked以及该接口的实现,名为DefaultUsageTracked,以下方面声明服务的所有实现者接口也实现了UsageTracked接口(例如,通过 JMX 进行统计):spring-doc.cadn.net.cn

@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()
	}
}

要实现的接口由带注释的字段的类型决定。 这value属性的@DeclareParentsannotation 是 AspectJ 类型的模式。 任何 匹配类型的 bean 实现了UsageTracked接口。 请注意,在前面示例的before 建议中,服务 bean 可以直接用作的实现UsageTracked接口。 如果以编程方式访问 bean,您将编写以下内容:spring-doc.cadn.net.cn

UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean("myService", UsageTracked.class)