AOP 是 Aspect-Oriented Programming (面向切面编程的)的简称
这里还是先给出一个比较专业的概念定义:
通知(Advice)
切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点。
切点(Pointcut)
一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。
切面(Aspect)
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。
引入(Introduction)
引入允许我们向现有的类添加新方法或属性。
织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入:
advice 定义了在连接点做什么,为切面增强提供了织入接口,在springAop中,在他主要描述SpringAop围绕方法调用注入的切面行为。
在spring aop的实现中,使用了 Advice 统一接口,为Aop紫萼面增强的植入共嗯做了更多的斜街和扩展,
package org.aopalliance.aop;
public interface Advice {
}
先从 beafore 开始,了解他的层次关系
MethodBeforeAdvice 定义了为待增强的目标方法设置的前置增强接口
public interface MethodBeforeAdvice extends BeforeAdvice {
//定义了 在调用给定方法之前进行回调
void before(Method method, Object[] args, @Nullable Object target) throws Throwable;
}
CountingBeforeAdvice 统计被调用方法的次数 使用count方法,完成对调用方法名的统计工作
public class CountingBeforeAdvice extends MethodCounter implements MethodBeforeAdvice {
@Override
public void before(Method m, Object[] args, Object target) throws Throwable {
// 统计被调用方法的次数
count(m);
}
}
MethodCounter 维护了一个 hash表用来统计数据。
并没有指定要实现的接口方法,他在抛出异常是被毁掉,这个回调时使用反射机制来完成的
public interface ThrowsAdvice extends AfterAdvice {
}
public static class CountingThrowsAdvice extends MethodCounter implements ThrowsAdvice {
public void afterThrowing(IOException ex) throws Throwable {
count(IOException.class.getName());
}
public void afterThrowing(UncheckedException ex) throws Throwable {
count(UncheckedException.class.getName());
}
}
切点决定Advice通知应该作用在哪一个连接点,也就是说通过 Pointcaut来顶需要增强的方法集合,之恶集合的选取按照一定的规则来生成。在这种情况下,Pointcut通常意味着标识方法
public interface Pointcut {
// 始终匹配的规范切入点实例。
ClassFilter getClassFilter();
// 为该切入点返回MethodMatcher。用来判断当前方法是否需要增强
MethodMatcher getMethodMatcher();
// 始终匹配的规范切入点实例。
Pointcut TRUE = TruePointcut.INSTANCE;
}
以 JdkRegexpMethodPointcut 为切入点具体了解一下PointCut 的工作原理。
JdkRegexpMethodPointcut 通过正则表达式对方法名进行匹配的功能。
// 通过正则表达式进行比配
@Override
protected boolean matches(String pattern, int patternIndex) {
Matcher matcher = this.compiledPatterns[patternIndex].matcher(pattern);
return matcher.matches();
}
在 spring aop 中 还提供了其他的 MethodMatcher ,比如通过方法名进行Advice匹配的NameMatchMethodPointcut。
完成对目标方法增强设计后 (Advice)和关注点的设计(Pointcut)以后,需要一个对象把他们集合起来,完成这个作用的就是 Advisor ,可以定义应该使用哪个通知并在哪个关注点使用它,也就是说通过Advisor,把Advice和Pointcut结合起来,这个结合为使用Ioc容器配置Aop应哟ing提供了遍历,
DefaultPointcutAdvisor 可以分别配置 advice 和pointcut,
private Pointcut pointcut = Pointcut.TRUE;
private Advice advice = EMPTY_ADVICE;