spring5.0源码解析 Aop 01

spring5.0源码解析 Aop

AOP 是 Aspect-Oriented Programming (面向切面编程的)的简称
这里还是先给出一个比较专业的概念定义:

  • 通知(Advice)
      切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。

  • 连接点(Join point)
      连接点是在应用执行过程中能够插入切面的一个点。

  • 切点(Pointcut)
      一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。

  • 切面(Aspect)
      切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。

  • 引入(Introduction)
      引入允许我们向现有的类添加新方法或属性。

  • 织入(Weaving)
      织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入:

Advice通知

advice 定义了在连接点做什么,为切面增强提供了织入接口,在springAop中,在他主要描述SpringAop围绕方法调用注入的切面行为。

在spring aop的实现中,使用了 Advice 统一接口,为Aop紫萼面增强的植入共嗯做了更多的斜街和扩展,

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

先从 beafore 开始,了解他的层次关系

beforeAdvice

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表用来统计数据。

ThrowsAdvice

并没有指定要实现的接口方法,他在抛出异常是被毁掉,这个回调时使用反射机制来完成的

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());
		}
	}

PointCut 切点

切点决定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。

Advisor 通知器

完成对目标方法增强设计后 (Advice)和关注点的设计(Pointcut)以后,需要一个对象把他们集合起来,完成这个作用的就是 Advisor ,可以定义应该使用哪个通知并在哪个关注点使用它,也就是说通过Advisor,把Advice和Pointcut结合起来,这个结合为使用Ioc容器配置Aop应哟ing提供了遍历,

DefaultPointcutAdvisor

DefaultPointcutAdvisor 可以分别配置 advice 和pointcut,

private Pointcut pointcut = Pointcut.TRUE;
private Advice advice = EMPTY_ADVICE;
  • Pointcut TRUE = TruePointcut.INSTANCE; TruePointcut.INSTANCE是一个单例模式 返回一个始终匹配的规范切入点实例。
  • EMPTY_ADVICE 时一个空的通知实例
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1999

每人一点点,明天会更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值