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)方法继续验证,这个方法多了一个参数,可以对目标方法传入的参数进行校验。
