介绍
介绍(在 AspectJ 中称为类型间声明)使一个 aspect 能够声明 ,建议对象实现给定的接口,并且要提供 该接口代表这些对象。
您可以使用@DeclareParents
注解。此批注
用于声明匹配类型具有新的父级(因此得名)。例如
给定一个名为UsageTracked
以及名为DefaultUsageTracked
,以下方面声明 service 的所有 implementationrs
接口还实现了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
annotation 是一种 AspectJ 类型的模式。任何
bean 的 bean 实现UsageTracked
接口。请注意,在
在前面的示例的 advice 之前,服务 bean 可以直接用作
的UsageTracked
接口。如果以编程方式访问 Bean,则
您将编写以下内容:
-
Java
-
Kotlin
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean<UsageTracked>("myService")