• SpringBoot中对Spring AOP的实现


    SpringBoot中对Spring AOP的实现

    AOP简介

    AOP (Aspect Oriented Programming), 面向切面编程,是Spring的三大核心思想之一,Spring的三大核心思想是:

    • IOC 控制反转,也就是IOC容器,我们可以在容器中事先创建对象,后面用到对象的时候就不用再new了,可以直接从IOC容器里面取出来。
    • DI 依赖注入,就是说Spring的对象是在配置文件里面配置的,可以在配置文件里面把一个对象注入给另外一个对象。
    • AOP 面向切面编程,可以大大的解耦,把一些无关业务逻辑的代码单独的抽取出来

    引入依赖

    在原先的SpringBoot项目里面多加上一个spring-boot-starter-aop依赖,如下图:
    在这里插入图片描述

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

    我们没有必要使用原始的Spring框架中的aop,因为需要配置各种配置文件,太繁琐了。好的是,SpringBoot中已经继承了SpringAOP,因此我们直接在SpringBoot中引入对应的依赖就可以了。

    AOP体系与概念

    简单地去理解,其实AOP要做三类事:

    • 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。
    • 在什么时候切入,是业务代码执行前还是执行后。
    • 切入后做什么事,比如做权限校验、日志记录等。

    AOP的体系图:
    在这里插入图片描述
    一些概念如下图:
    在这里插入图片描述

    编写AOP切面类

    如下图:
    在这里插入图片描述
    代码如下:

    package com.xzy.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.*;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    /**
     * @author xuan
     * @create 2023/10/25
     */
    @Component
    @Aspect
    public class ControllerAspect {
    
        @Pointcut("execution(* com.xzy.controller.*.*(..))")
        public void pointCut() {
    
        }
    
        @After("pointCut()")
        public void doAfter() {
            System.out.println("------------- doAfter.");
        }
    
        @Before("pointCut()")
        public void doBefore() {
            System.out.println("------------- doBefore.");
        }
    
        @Around("pointCut()")
        public Object doAround(ProceedingJoinPoint joinPoint) {
            System.out.println("------------- doAround.执行方法之前的处理");
            Object obj = null;
            try {
                obj = joinPoint.proceed();
                System.out.println("------------- doAround.执行方法之后的处理");
            } catch (Throwable t) {
                t.printStackTrace();
            }
            return obj;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    启动SpringBoot项目然后访问controller控制器

    在这里插入图片描述
    最后看一下控制台的输出,如下图:
    在这里插入图片描述
    可以切面的执行顺序是:先执行环绕通知的前置通知,再执行前置通知,接着执行后置通知,最后执行环绕通知的后置通知。

    对环绕通知放行

    注意一点,在环绕通知中必须要对方法放行,否则程序会卡在环绕通知的地方,如下图:
    在这里插入图片描述

    execution表达式的含义

    在这里插入图片描述

    • 第一个 * : 表示的是返回类型, * 表示的是所有返回类型都可以;
    • 包名com.xzy.controller表示的是需要拦截的包名就是com.xzy.controller包下的类;
    • 第二个 * : 表示的是com.xzy.controller包下的类, * 表示的是所有类都可以;
    • 最后一个 * : 表示的是这个类下面的方法, * 表示的是所有方法都可以;
    • 小括号里的 点点 : 表示的是方法的参数, 点点表示的是任意参数都可以;

    通过注解方式定义切点

    如下图:
    在这里插入图片描述
    使用上面的切面的话,就会切入注解是@GetMapping的所有方法。这种方式很适合处理@GetMapping,@PostMapping,@DeleteMapping不同注解有各种特定处理逻辑的场景。

    使用注解切面除了使用的是@annotation定义切入点,其它的和上面的切面没啥差别;

  • 相关阅读:
    新一代前端应该使用的“开发套餐“
    万字爽文一篇带你掌握Java8新特性
    将Eureka服务注册到Eureka中心
    JuiceFS 在多云架构中加速大模型推理
    vb.net 实时监控双门双向门禁控制板源代码
    Unity之ShaderGraph如何实现UV抖动
    PHP:类的基本概念
    数据结构——第一章 算法
    linux导入oracle备份好的数据库
    Spring注入集合
  • 原文地址:https://blog.csdn.net/qq_45950109/article/details/134035786