• 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 {
    }
    
    • 1
    • 2
    • 3

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

    beforeAdvice

    MethodBeforeAdvice 定义了为待增强的目标方法设置的前置增强接口

    public interface MethodBeforeAdvice extends BeforeAdvice {
    	//定义了 在调用给定方法之前进行回调
    	void before(Method method, Object[] args, @Nullable Object target) throws Throwable;
    }
    
    • 1
    • 2
    • 3
    • 4

    CountingBeforeAdvice 统计被调用方法的次数 使用count方法,完成对调用方法名的统计工作

    public class CountingBeforeAdvice extends MethodCounter implements MethodBeforeAdvice {
    	@Override
    	public void before(Method m, Object[] args, Object target) throws Throwable {
    		// 统计被调用方法的次数
    		count(m);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    MethodCounter 维护了一个 hash表用来统计数据。

    ThrowsAdvice

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

    public interface ThrowsAdvice extends AfterAdvice {
    }
    
    • 1
    • 2
    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());
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    PointCut 切点

    切点决定Advice通知应该作用在哪一个连接点,也就是说通过 Pointcaut来顶需要增强的方法集合,之恶集合的选取按照一定的规则来生成。在这种情况下,Pointcut通常意味着标识方法
    在这里插入图片描述

    public interface Pointcut {
    	// 始终匹配的规范切入点实例。
    	ClassFilter getClassFilter();
    	// 为该切入点返回MethodMatcher。用来判断当前方法是否需要增强
    	MethodMatcher getMethodMatcher();
    	// 始终匹配的规范切入点实例。
    	Pointcut TRUE = TruePointcut.INSTANCE;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以 JdkRegexpMethodPointcut 为切入点具体了解一下PointCut 的工作原理。
    JdkRegexpMethodPointcut 通过正则表达式对方法名进行匹配的功能。

    // 通过正则表达式进行比配
    	@Override
    	protected boolean matches(String pattern, int patternIndex) {
    		Matcher matcher = this.compiledPatterns[patternIndex].matcher(pattern);
    		return matcher.matches();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 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;
    
    • 1
    • 2
    • Pointcut TRUE = TruePointcut.INSTANCE; TruePointcut.INSTANCE是一个单例模式 返回一个始终匹配的规范切入点实例。
    • EMPTY_ADVICE 时一个空的通知实例
  • 相关阅读:
    AI大模型日报#0420:开源模型击败GPT-4、西湖大学蛋白质通用大模型、GPT的七条经验
    Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。
    如果各位同学还对时间复杂度有疑问?看这一篇就可以啦!
    力扣(LeetCode)2652. 倍数求和(C++)
    经过一个多月的等待我有幸成为Spring相关项目的Contributor
    Git - branch name
    6个小技巧,帮助职场新人培养项目管理能力
    工程企业管理软件源码-综合型项目管理软件
    Android Studio编译及调试知识
    前端食堂技术周刊第 99 期:Remix 2.0、v0、2023 组件库盘点、TS Config 备忘录、Hello 算法
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126235171