欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring底层源码分析-Spring AOP概述

程序员文章站 2022-05-23 14:19:17
...

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来定义徐娅增强的方法的集合,这些集合的选取可以按照一定的规则来完成(例如正则表达式)。

类继承关系如下:

spring底层源码分析-Spring AOP概述

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。