spring底层源码分析-Spring AOP概述
文章目录
3、Spring AOP概述
3.1 Advice通知
**Advice通知定义连接点做什么。**在Spring AOP的实现中使用了Advice这个统一接口,并通过这个接口 提供了更具体的通知类型,如:BeforeAdvice、AfterAdvice、ThrowsAdvice等。
3.1.1 前置通知接口
BeforAdvice接口,定义了为待增强的目标方法设置的前置增强接口MethodBeforeAdvice接口(MethodBeforeAdvice接口继承BeforAdvice接口),使用这个MethodBeforeAdvice前置接口需要实现一个回调函数:
void before(Method method, Object[] args, @Nullable Object target) throws Throwable;
before方法的实现在Advice被配置到目标方法后,会在调用目标方法时被回调。**参数:**Method对象,这个参数是目标方法的反射对象;Object[ ]为目标方法的输入参数。
3.1.2 后置通知接口
AfterAdvice接口,定义了为待增强的目标方法设置的后置增强接口AfterReturningAdvice接口(AfterReturningAdvice接口继承AfterAdvice接口)。使用这个AfterReturningAdvice后置接口需要实现一个回调函数:
void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable;
afterReturning方法的实现在Advice被配置到目标方法后,会在目标方法调用结束并成功返回时被Spring AOP回调。参数:returnValue,目标方法的返回值;method,目标方法的反射对象;args,目标方法的输入参数。
3.1.3 异常通知接口
ThrowsAdvice接口,并没有指定需要实现的方法,它在抛出异常时被回调,这个回调是AOP使用反射机制来完成的。
3.2 Pointcut切点
Pointcut(切点)决定Advice通知应该作用于哪个连接点,也就是说通过Pointcut来定义徐娅增强的方法的集合,这些集合的选取可以按照一定的规则来完成(例如正则表达式)。
类继承关系如下:
在Pointcut接口中可以看到getMethodMatcher()方法,这个方法是获得MethodMatcher类,对于切点的匹配判断功能具体是由这个返回的MethodMatcher类来完成,也就是说由这个MethodMatcher类来判断是否需要对当前方法调用增强,或者是否需要对 当前调用方法 应用 配置好的Advice通知。
**JdkRegexpMethodPointcut就是正则表达式切点。**JdkRegexpMethodPointcut类完成通过正则表达式对方法名进行匹配的功能。
**在JdkRegexpMethodPointcut类中正是使用matches方法来使用正则表达式来对方法名进行匹配。**而matches方法是MethodMatcher定义的接口方法。对matches方法的调用 是在JdkDynamicAopProxy的invoke方法中触发的,invoke方法是Proxy对象进行回调的入口方法。
在Spring AOP中还提供了NameMatchMethodPointcut类,是通过方法名匹配来进行Advice匹配。matches方法实现如下:
public boolean matches(Method method, Class<?> targetClass) {
for (String mappedName : this.mappedNames) {
if (mappedName.equals(method.getName()) || isMatch(method.getName(), mappedName)) {
return true;
}
}
return false;
}
// 支持 xxx**yy等这样的匹配。
protected boolean isMatch(String methodName, String mappedName) {
return PatternMatchUtils.simpleMatch(mappedName, methodName);
}
3.3 Advisor通知器
完成对目标方法的切面增强设计(Advice)和关注点的设计(Pointcut)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor(通知器)。通过Advisor可以定义应该使用哪个通知并在哪个关注点使用它,也就是说通过Advisor,把Advice和Pointcut结合起来,这个结合为使用IoC容器配置AOP应用提供了遍历。
DefaultPointcutAdvisor类是Advisor接口的实现,有两个属性advice和pointcut,分别配置Advice和Pointcut。