实例

为所有的 Performance 实现引入下面的 Encoreable 接口:

package concert;

public interface Encoreable {
  void performEncore();
}

第一步:创建切面

为了实现该功能,我们要创建一个新的切面:

package concert;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

@Aspect
public class EncodeableIntroducer {

  @DeclareParents(value="concert.Performce+",
                  defaultImpl=DefaultEncoreable.class)
  public static Encoreable encoreable;
}

EncoreableIntroducer 是一个切面,通过 @DeclareParents 注解,将 Encoreable 接口引入到 Performance bean 中。

@DeclareParents 注解由三部分组成:

  • value 属性指定了哪种类型的 bean 要引入该接口。在本例中,也就是所有实现 Performance 的类型。(标记符后面的加号表示是 Performance 的所有子类型,而不是 Performance 本身。)

  • defaultImpl 属性指定了为引入功能提供实现的类。在这里,我们指定的是 DefaultEncoreable 提供实现。

  • @DeclareParents 注解所标注的静态属性指明了要引入的接口。在这里,我们所引入的是 Encoreable 接口。

第二步:将切面声明为一个 Bean

和其他的切面一样,需要在 Spring 应用中将 EncoreableIntroducer 声明为一个 bean:

@Bean
public EncoreableIntroducer encoreableIntroducer() {
    return new EncoreableIntroducer();
}

之后,Spring 的自动代理机制将会获取到它的声明,当 Spring 发现一个 bean 使用了 @Aspect 注解时,Spring 就会创建一个代理,然后将调用委托给被代理的 bean 或被引入的实现,这取决于调用的方法属于被代理的 bean 还是属于被引入的接口

Last updated