介绍
介绍(在AspectJ中称为inter-type声明)使切面能够声明被通知的对象实现给定的接口,并代表这些对象提供该接口的实现。
您可以使用@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
接口。请注意,在前面示例的前置通知中,服务bean可以直接用作UsageTracked
接口的实现。如果以编程方式访问bean,您将编写以下内容:
-
Java
-
Kotlin
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
val usageTracked = context.getBean("myService", UsageTracked.class)