AOP四大组件 连接点 切入点 通知 顾问

一、连接点JoinPoint接口

package org.aopalliance.intercept;
 
public interface Joinpoint {
          
   
 
    /**
     * 转到拦截器链中的下一个拦截器
     */
    Object proceed() throws Throwable;
 
    /**
     * 返回保存当前连接点静态部分【的对象】,这里一般指被代理的目标对象
     */
    Object getThis();
 
    /**
     * 返回此静态连接点  一般就为当前的Method(至少目前的唯一实现是MethodInvocation,所以连接点得静态部分肯定就是本方法)
     */
    AccessibleObject getStaticPart();//当前的方法
 
}

几个重要的子接口,如下:

2、Invocation接口

package org.aopalliance.intercept;
 
/**
 * 此接口表示程序中的调用
 * 调用是一个连接点,可以被拦截器拦截。
 */
public interface Invocation extends Joinpoint {
          
   
 
    /**
     * 将参数作为数组对象获取。可以更改此数组中的元素值以更改参数。
     * 通常用来获取调用目标方法的参数
     */
    Object[] getArguments();
 
}

4、MethodInvocation

package org.aopalliance.intercept;
 
import java.lang.reflect.Method;
 
/**
 * 方法调用的描述,在方法调用时提供给拦截器。
 * 方法调用是一个连接点,可以被方法拦截器拦截。
 */
public interface MethodInvocation extends Invocation {
          
   
 
    /**
     * 返回正在被调用得方法~~~  返回的是当前Method对象。
     * 此时,效果同父类的AccessibleObject getStaticPart() 这个方法
     */
    Method getMethod();
 
}

二、通知advice

package org.aopalliance.aop;
 
public interface Advice {
          
   
}

三、切入点(PointCut)

package org.springframework.aop;
 
public interface Pointcut {
          
   
 
    /**
     * 类过滤器, 可以知道哪些类需要拦截
     */
    ClassFilter getClassFilter();
 
    /**
     * 方法匹配器, 可以知道哪些方法需要拦截
     */
    MethodMatcher getMethodMatcher();
 
    /**
     * 匹配所有对象的 Pointcut,内部的2个过滤器默认都会返回true
     */
    Pointcut TRUE = TruePointcut.INSTANCE;
 
}

ClassFilter接口

@FunctionalInterface
public interface ClassFilter {
          
   
 
    /**
     * 用来判断目标类型是否匹配
     */
    boolean matches(Class<?> clazz);
 
}

MethodMatcher接口

public interface MethodMatcher {
          
   
 
    /**
     * 执行静态检查给定方法是否匹配
     * @param method 目标方法
     * @param targetClass 目标对象类型
     */
    boolean matches(Method method, Class<?> targetClass);
 
    /**
     * 是否是动态匹配,即是否每次执行目标方法的时候都去验证一下
     */
    boolean isRuntime();
 
    /**
     * 动态匹配验证的方法,比第一个matches方法多了一个参数args,这个参数是调用目标方法传入的参数
     */
    boolean matches(Method method, Class<?> targetClass, Object... args);
 
 
    /**
     * 匹配所有方法,这个内部的2个matches方法任何时候都返回true
     */
    MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;
 
}

1.调用matches(Method method, Class<?> targetClass)方法,验证方法是否匹配 2.isRuntime方法是否为true,如果为false,则以第一步的结果为准,否则继续向下 3.调用matches(Method method, Class<?> targetClass, Object… args)方法继续验证,这个方法多了一个参数,可以对目标方法传入的参数进行校验。

四、顾问(Advisor)

经验分享 程序员 微信小程序 职场和发展