Spring AOP 代码案例

目录

AOP组成

通知的具体方法类型

[引入Spring AOP依赖](#引入Spring AOP依赖)

定义AOP层

UserController

Postman测试

AOP工作流程


AOP组成

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

通知的具体方法类型

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

引入Spring AOP依赖

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

定义AOP层

java 复制代码
@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

java 复制代码
@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代理对象, 根据代理对象的运行模式, 运行原始方法, 增强的内容, 完成操作


相关推荐
xu_yule7 小时前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
举大栗子7 小时前
基于Java的Socket.IO服务端基础演示
后端
合作小小程序员小小店7 小时前
网页开发,在线%新版本旅游管理%系统,基于eclipse,html,css,jquery,servlet,jsp,mysql数据库
java·数据库·eclipse·html·intellij-idea·旅游·jsp
用户69371750013847 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
组合缺一8 小时前
Spring Boot 国产化替代方案。Solon v3.7.2, v3.6.5, v3.5.9 发布(支持 LTS)
java·后端·spring·ai·web·solon·mcp
s***11708 小时前
常见的 Spring 项目目录结构
java·后端·spring
O***P5718 小时前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea
7***47718 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端
2***c4358 小时前
解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南
java·tomcat·intellij-idea