一位攻城狮的自我修养

Spring AOP框架学习文档!分析说明接口引入类Introd

2022-01-05  本文已影响0人  攻城狮Chova
Spring AOP文档

introduction和advice比较

introduction

通过IntroductionInterceptor接口实现

public interface IntroductionInterceptor extends MethodInterceptor {

  /*
       * 此方法用于判断该introduction实现是否实现了intf接口类
       * 所有对inf接口的调用方法都会转发给incoke方法,由invoke方法完成相应的任务
       *
   * @param intf 接口类
   * @return boolean 该introduction实现是否实现的接口类
       */
  boolean implementsInterface(Class intf);

  // invoke()方法来源于MethodInterceptor
  invoke(MethodInvocation invocation);
}

1.添加新的接口定义:

/**
 * 1. auditable接口定义
 */
 public interface Auditable {
    void setLastModifiedDate(Date date);
    Date getLastModifiedDate();
 }

2.该新的接口的实现,必须实现Spring的IntroductionIntercepter:

/**
 * 2. auditable接口的实现,同时要实现IntroductionIntercepter接口
 */
public class AuditableMixin implements IntroductionInterceptor, Aduitable {

    /*
     * 实现IntroductionInterceptor接口中的implementsInterface接口
     */
     public boolean implementsInterface(Class intf) {
        // AuditableMixin实现了Auditable类的功能
        return intf.isAssignableFrom(Auditable.class);
     }

    public Object invoke(MethodInvocation m) throws Throwable {
        /*
         * 对invoke中的参数m进行判断,当前的调用是否在implementsInterface范围内
         * 即当前的调用是否是auditable接口中的方法
         */
        if (implementsInterface(m.getMethod().getDeclaringClass())) {
            /*
             * 调用引入的方法,来源于auditable接口,这样就可以给target添加新的auditable接口
             * this就是对象本身
             */ 
             return m.getMethod().invoke(this, m.getArguments());
        } else {
            // 调用其余方法
            return m.proceed()
        }
    }
    // 实现auditable接口
    private Date lastModifiedDate;

    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }
    public void setLastModifiedDate(Date lastModifiedDate) {
        this.latsModifiedDate = lastModifiedDate;
    }
}

通过DelegatingIntroductionInterceptor接口实现

public class AuditableMixin extends DelegatingIntroductionInterceptor implements Auditable {
    private Date lastModifiedDate;
    
    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }
    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

Introduction总结

public class ImmutableMixin extends DelegatingIntroductionInterceptor implements Immutable {
    private boolean immutable;

    public void setImmutable(boolean immutable) {
        this.immutable = immutable;
    }

    /**
     * 修改invoke方法
     */
     public Object invoke(MethodInvocation m) throws Throwable {
        String name = mi.getMethod().getName();

       /*
        * 如果已经是immutable,就不可以调用setXxx()方法
        * 这样就改变了Target的行为,而不仅仅是添加行为
        */
        if (immutable && name.indexOf("set") == 0) {
            throw new IllegalModificationException();
        }
         return super.invoke(mi);
     }
}

Spring中Introduction

上一篇 下一篇

猜你喜欢

热点阅读