引入

引入(Introductions,在 AspectJ 中称为类型间声明)允许切面声明被通知的对象实现给定的接口, 并代表这些对象提供该接口的实现。

你可以使用 @DeclareParents 注解来进行引入。 此注解用于声明匹配的类型有一个新的父类(因此得名)。 例如,给定一个名为 UsageTracked 的接口和该接口名为 DefaultUsageTracked 的实现, 以下切面声明所有服务接口的实现者也实现 UsageTracked 接口(例如,用于通过 JMX 进行统计):

  • Java

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

}

要实现的接口由带注解字段的类型确定。 @DeclareParents 注解的 value 属性是一个 AspectJ 类型模式。 任何匹配类型的 bean 都实现了 UsageTracked 接口。 请注意,在前面示例的前置通知中,服务 bean 可以直接用作 UsageTracked 接口的实现。 如果以编程方式访问 bean,你可以这样写:

  • Java

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