对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-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 属性的 @DeclareParents 注解是一个 AspectJ 类型模式。任何匹配类型的 bean 都会实现 UsageTracked 接口。请注意,在前面示例的前置通知中,可以直接将服务 bean 用作 UsageTracked 接口的实现。如果需要程序化地访问 bean,你可以这样写:spring-doc.cadn.net.cn

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