• Spring AOP


    目录

    1. 什么是Spring AOP?为什么要用AOP?

    2. AOP的使用

    2.1 AOP组成​编辑

    2.2 Spring AOP实现 

    3. 总结

    1. 什么是Spring AOP?为什么要用AOP?

    AOP(Aspect Oriented Programming)面向切面编程,是一种思想,是对某一类事情的集中处理。

    AOP 是一种思想,而Spring AOP是一个框架,对AOP思想进行了实现。

    比如个人博客系统,我们需要多次判断用户是否是登录状态,在每个Controller中都写一遍用户登录验证,当功能越来越多时,写的相同的登录验证也越来越多,大大增加了代码的修改和维护成本。有了AOP之后,我们只需要在某⼀处配置⼀ 下,所有需要判断⽤户登录⻚⾯(中的⽅法)就全部可以实现⽤户登录验证了,不再需要每个⽅法中都写相同的⽤户登录验证了。

    因此,我们对于这种功能统⼀,且使⽤的地⽅较多的功能,就可以考虑 AOP 来统⼀处理了。

    AOP还可以实现:
            统⼀⽇志记录
            统⼀⽅法执⾏时间统计
            统⼀的返回格式设置
            统⼀的异常处理
            事务的开启和提交等

    2. AOP的使用

    2.1 AOP组成

    1. 切面:定义AOP的业务类型(要做什么?要登陆验证?还是记录日志?还是统计方法执行时间?)

    2. 连接点:AOP中所有的方法

    3. 切点:提供一组规则,用来匹配连接点

    4. 通知:提供AOP方法实现

            4.1 前置通知使用 (@Before)通知⽅法会在⽬标⽅法调⽤之前执⾏

            4.2 后置通知使用(@After)通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤

            4.3 返回之后通知使用(@AfterReturning)通知⽅法会在⽬标⽅法返回后调⽤

            4.4 抛异常后通知使用(@AfterThrowing)通知⽅法会在⽬标⽅法抛出异常后调⽤

            4.5 环绕通知使用(@Around)通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执⾏⾃定义的⾏为。

     a. 定义切面

    pointcut ⽅法为空⽅法,它不需要有⽅法体,此⽅法名就是起到⼀个“标识”的作⽤

     b. 定义切点 

    c. 定义通知 

     Spring AOP语法(切点表达式说明):

    切点表达式由切点函数组成,其中 execution() 是最常⽤的切点函数,⽤来匹配⽅法,语法为:

            execution(<修饰符><返回类型><包.类.方法(参数)><异常>)

    定义规则:拦截UserController下的所有方法
    三种通配符:
            * :匹配任意字符,只匹配⼀个元素(包,类,或⽅法,⽅法参数)
            .. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
            + :表示按照类型匹配指定类的所有类,必须跟在类名后⾯,如 com.cad.Car+ ,表示继承该类的所有⼦类包括本身。

    1. 修饰符,一般省略

             public ----> 公共方法     

             * ----> 任意

    2. 返回类型,不能省略

            void  ----> 没有返回类型

            String  ----> 返回类型字符串

            *  ----> 任意

    3. 包

            com.mm.xx  ----> 固定包

            com.mm.xx.*.*.service  ----> xx 包下面的任意子包

            com.mm.xx..  ----> xx包下面的所有子包(包含自己)

            com.mm.xx.*.service..  ----> xx包下面的任意子包,目录service下任意包

    4. 类

            UserServiceImpl   ----> 指定类

            *impl   ----> 一impl 结尾

            User*   ----> 以User 开头

            *   ---->  任意

    5. 方法名,不能省略

            addUser   ---->  固定方法

            add*   ----> 以add开头

            *add   ----> 以add结尾

            *   ---->  任意

    6. 参数

            ()   ----> 无参

            (int)   ----> 一个整形

            (int, int)   ----> 两个整形

            (..)    ----> 参数任意

    7. throws ,可省略,一般不写

    execution(* com.cad.demo.User.*(..)) :匹配 User 类⾥的所有⽅法。
    execution(* com.cad.demo.User+.*(..)) :匹配该类的⼦类包括该类的所有⽅法。
    execution(* com.cad.*.*(..)) :匹配 com.cad 包下的所有类的所有⽅法。
    execution(* com.cad..*.*(..)) :匹配 com.cad 包下、⼦孙包下所有类的所有⽅法。
    execution(* addUser(String, int)) :匹配 addUser ⽅法,且第⼀个参数类型是 String,第⼆个参数类型是 int。

    2.2 Spring AOP实现 

    Spring AOP 是通过动态代理的⽅式,Spring​​​​​​​ AOP代理实现方式:

            1. JDK Proxy

            2. CGLIB (基于字节码的动态代理)

    这两种⽅式的代理⽬标都是被代理类中的⽅法,在运⾏期,动态的织⼊字节码⽣成代理类。

    AOP实现手段:

            1. Spring AOP

            2. AspectJ 

    3. 总结

    AOP 是对某⽅⾯能⼒的统⼀实现,它是⼀种实现思想,Spring AOP 是对 AOP 的具体实现,Spring AOP 可通过 AspectJ(注解)的⽅式来实现 AOP 的功能,Spring AOP 的实现步骤是:
    1. 添加 AOP 框架⽀持。
    2. 定义切⾯和切点。
    3. 定义通知。
    Spring AOP 是通过动态代理的⽅式,在运⾏期将 AOP 代码织⼊到程序中的,它的实现⽅式有两种: JDK Proxy 和 CGLIB。
  • 相关阅读:
    [蓝桥杯 2022 省 A] 推导部分和
    ​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署
    ImmunoChemistry艾美捷平底MicroTiter平板说明书
    fpga bitstream userid
    Web相机和浏览器的二维码扫描方案
    GreenPlum6.x之ETL工具
    基于vue+Element Table Popover 弹出框内置表格的封装
    Seata源码分析——SessionManager
    Redux系列实现异步请求
    Linux基础知识——tmux和vim
  • 原文地址:https://blog.csdn.net/m0_48273471/article/details/125982748