• 7天学完Spring:Spring AOP统一问题处理


    前言

    Spring AOP 之前,首先要了解一下什么是 AOP?

    AOP(Aspect Oriented Programming):面向切面编程,它是一种思想,它是对某一类事情的集中处理。比如用户登录权限的效验,没学 AOP 之前,我们所有需要判断用户登录的页面(中的方法),都要各自实现或调用用户验证的方法,然而有了 AOP 之后,我们只需要在某一处配置一下,所有需要判断用户登录页面(中的方法)就全部可以实现用户登录验证了,不再需要每个方法中都写相同的用户登录验了。

    和之前的MVC以及Spring MVC,或者说IoC以及DI类似。这里的AOP是一个一种思想,而Spring AOP是一个框架,提供了一种对AOP思想的实现。

    一丶关于Spring AOP的作用

    上面其实我们已经模拟了一个场景,就是说我们在做后台系统时,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器( Controller)都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?

    我们之前的处理方式是每个 Controller 都要写一遍用户登录验证,然而当你的功能越来越多,那么你要写的登录验证也越来越多,而这些方法又是相同的,这么多的方法就会代码修改和维护的成本。那有没有简单的处理方案呢?答案是有的,对于这种功能统一,且使用的地方较多的功能,就可以考虑 AOP 来统一处理了。
    所以AOP的作用如下:
    1.统一的用户登录判断
    这里的场景上面都说了。所以这里不做过多讲解


    2.统一日志记录
    在这里插入图片描述
    3.统一方法执行时间统计
    在这里插入图片描述
    4.统一的返回格式设置 + 5.统一的异常处理
    这里的话,我就一起说了,因为这两个通常配合起来使用
    在这里插入图片描述
    6.事务的开启和提交等
    想·

    二丶关于Spring AOP的学习目标

    <1>学习AOP是如何组成?也就是学习AOP的组成的相关概念

    1>切面(Aspect)

    在这里插入图片描述

    2>连接点(Join Point)

    在这里插入图片描述

    3>切点(Pointcut)

    在这里插入图片描述

    4>通知(Advice)

    在这里插入图片描述
    前置通知使用 @Before:通知方法会在目标方法调用之前执行。
    后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用。
    返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用。
    抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用。
    环绕通知使用 @Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

    <2>学习Spring AOP使用–案例:统计业务执行时间

    1> 添加 AOP 框架支持

    这里是引用
    添加代码完成之后刷新maven面板,然后可以看到依赖添加成功
    在这里插入图片描述
    这里贴一下要加的代码吧

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    2>定义切面

    在这里插入图片描述

    3>定义切点–切点表达式的学习

    切点指的是具体要处理的某一类问题,比如用户登录权限验证就是一个具体的问题,记录所有方法的执行日志就是一个具体的问题,切点定义的是某一类问题。
    Spring AOP 切点的定义如下,在切点中我们要定义拦截的规则,具体实现如下:
    在这里插入图片描述

    在这里需要特别说明一下:
    AspectJ 支持三种通配符:

    在这里插入图片描述
    切点表达式由切点函数组成,其中 execution() 是最常用的切点函数,用来匹配方法,语法为:execution(<修饰符><返回类型><包.类.方法(参数)><异常>)
    修饰符和异常可以省略,以下为我们的切点表示式示例
    在这里插入图片描述

    4>定义相关通知

    通知定义的是被拦截的方法具体要执行的业务,比如用户登录权限验证方法就是具体要执行的业务。
    Spring AOP 中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:
    前置通知使用@Before:通知方法会在目标方法调用之前执行。
    后置通知使用@After:通知方法会在目标方法返回或者抛出异常后调用。
    返回之后通知使用@AfterReturning:通知方法会在目标方法返回后调用。
    抛异常后通知使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
    环绕通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

    演示如下:
    在这里插入图片描述

    5>打印日志

    在这里插入图片描述

    然后此时根据执行的结果也就能看出我们上述代码的执行顺序
    在这里插入图片描述
    这里不太完善,我们补充下
    在这里插入图片描述
    然后具体的打印流程如下
    在这里插入图片描述

    <3>学习Spring AOP实现原理

    Spring AOP 是构建在动态代理基础上,因此 Spring 对 AOP 的支持局限于方法级别的拦截。

    这里的拦截方式分为两种: JDK Proxy 和 CGLIB 方式
    默认情况下,实现了接口的类,使用 AOP 会基于 JDK 生成代理类,没有实现接口的类,会基于 CGLIB 生成代理类。
    在这里插入图片描述

    1>织入(Weaving):代理的生成时机

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

    编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以
    这种方式织入切面的。
    类加载器:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader,它
    可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time 
    weaving. LTW)就支持以这种方式织入切面。
    运行期:切面在应用运行的某一时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象
    动态创建一个代理对象。SpringAOP就是以这种方式织入切面的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2>动态代理

    此种实现在设计模式上称为动态代理模式,在实现的技术手段上,都是在 class 代码运行期,动态的织入字节码。
    我们学习 Spring 框架中的AOP,主要基于两种方式:JDK 及 CGLIB 的方式。这两种方式的代
    理目标都是被代理类中的方法,在运行期,动态的织入字节码生成代理类。
    1.CGLIB是Java中的动态代理框架,主要作用就是根据目标类和方法,动态生成代理类。
    2.Java中的动态代理框架,几乎都是依赖字节码框架(如 ASM,Javassist 等)实现的。
    3.字节码框架是直接操作 class 字节码的框架。可以加载已有的class字节码文件信息,修改部分信息,或动态生成一个 class
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3>JDK 和 CGLIB 的区别

    这里是引用

  • 相关阅读:
    Java初学者也可以实现的图书系统小练习
    Jmeter提取协议报文、请求头、请求体、响应体
    Postman 配置全局变量 postman设置全局token
    java基于springboot+vue的高校教师人事管理系统 elementui
    xgp加速器免费 微软商店xgp用什么加速器
    考研以后还是要工作,那考研的意义在哪里呢?
    从夜间照明到随动转向速锐得解码比亚迪唐车灯升级改装技术方案
    北航投资携核心医疗获2023年度十佳投资案例
    【网络】个人博客网站搭建之Typecho(命令版)
    sdkman 的安装配置与 sdk 管理
  • 原文地址:https://blog.csdn.net/weixin_53860901/article/details/125990551