|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
简介
引入(在 AspectJ 中称为类型间声明)使切面能够声明被通知对象实现某个给定的接口,并代表这些对象提供该接口的实现。
你可以使用 @DeclareParents 注解来引入(introduction)。该注解用于声明匹配的类型拥有一个新的父类(因此得名)。例如,给定一个名为 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()
}
}
要实现的接口由被注解字段的类型决定。value 注解的 @DeclareParents 属性是一个 AspectJ 类型模式。任何匹配该类型的 bean 都会实现 UsageTracked 接口。请注意,在前面示例的前置通知(before advice)中,服务 bean 可以直接用作 UsageTracked 接口的实现。如果以编程方式访问 bean,则应编写如下代码:
-
Java
-
Kotlin
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean("myService", UsageTracked.class)