Spring AOP 代码案例

目录

AOP组成

通知的具体方法类型

引入Spring AOP依赖

定义AOP层

UserController

Postman测试

AOP工作流程


AOP组成

  • 切面 : 切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义,切⾯是包含了:通知、切点和切⾯的类,相当于 AOP 实现的某个功能的集合
  • 连接点 : 应⽤执⾏过程中能够插⼊切⾯的⼀个点,这个点可以是⽅法调⽤时,抛出异常时,甚⾄修改字段时。切⾯代码可以利⽤这些点插⼊到应⽤的正常流程之中,并添加新的⾏为. 
  • 切点 : Pointcut 是匹配 Join Point 的谓词,切点相当于保存了众多连接点的⼀个集合(如果把切点看成⼀个表,⽽连接点就是表中⼀条⼀条的数据
  • 通知 : 切⾯的⼯作被称之为通知, 实现的这个切面提供什么功能

通知的具体方法类型

  • 前置通知: @Before, 通知方法会在目标方法执行之前执行
  • 后置通知: @After, 通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤
  • 返回之后通知: @AfterReturning, 通知方法会在目标返回后调用
  • 抛异常后通知: @AfterThrowing , 通知方法会在抛出异常后调用
  • 环绕通知: @Around, 通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执
    ⾏⾃定义的⾏为

引入Spring AOP依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 

定义AOP层

@Aspect // 定义这个类为切面
@Component // 让这个类随着spring项目的启动而注入被自动识别
public class UserAspect {

    // 定义切点
    @Pointcut("execution(* *com.example.springaoptest1.userController.UserController.*(..))")  // 定义切点
    public void pc(){};

    @Before("pc()")
    public void doBefore() {
        System.out.println("执行前置通知");
    }

    @Around("pc()")
    public Object doAroud(ProceedingJoinPoint joinPoint) {
        System.out.println("环绕通知开始执行");
        Object ret;
        try {
            ret = joinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        System.out.println("环绕通知执行之后");
        return ret;
    }

}

UserController

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getUser")
    public String getUser() {
        System.out.println("do getUser!");
        return "user";
    }

    @RequestMapping("/delUser")
    public String delUser() {
        System.out.println("do delUser!");
        return "del user";
    }
}

Postman测试

 

AOP工作流程

  1. Spring容器启动
  2. 读取所有配置中的切入点
  3. 初始化bean, 判定bean对应的类中的方法是否匹配到任意切入点
    1. 匹配失败, 创建对象
    2. 匹配成功, 创建原始对象的代理对象
  4. 获取bean执行方法
    1. 获取bean, 调用方法并执行, 完成操作
    2. 获取的是bean代理对象, 根据代理对象的运行模式, 运行原始方法, 增强的内容, 完成操作

        



相关推荐

  1. t检验案例代码

    2023-12-06 14:48:02       34 阅读
  2. SpringAOP的实现原理

    2023-12-06 14:48:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 14:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 14:48:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 14:48:02       82 阅读
  4. Python语言-面向对象

    2023-12-06 14:48:02       91 阅读

热门阅读

  1. Python edge-tts库全部声音模型一览表

    2023-12-06 14:48:02       38 阅读
  2. 深度学习与深度迁移学习有什么区别?

    2023-12-06 14:48:02       56 阅读
  3. flutter的Overlay详解

    2023-12-06 14:48:02       60 阅读
  4. IDC网络设备监控脚本-FLOW流监控

    2023-12-06 14:48:02       40 阅读
  5. 代码随想录二刷 |队列与栈 |有效的括号

    2023-12-06 14:48:02       69 阅读
  6. ubuntu重启后下无wifi,蓝牙和飞行模式切换问题

    2023-12-06 14:48:02       57 阅读
  7. github可访问但无法clone问题

    2023-12-06 14:48:02       49 阅读
  8. Linux计算机系统参数获取和压力测试

    2023-12-06 14:48:02       54 阅读
  9. Ubuntu22.04LTS配置rsync服务

    2023-12-06 14:48:02       59 阅读
  10. [cmake] --- find_package

    2023-12-06 14:48:02       44 阅读
  11. 如何关闭vue项目中的[eslint]校验

    2023-12-06 14:48:02       66 阅读