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


相关推荐
科技资讯早知道5 分钟前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
小比卡丘1 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
xmh-sxh-13141 小时前
java 数据存储方式
java
liu_chunhai1 小时前
设计模式(3)builder
java·开发语言·设计模式
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健2 小时前
MQTT--Java整合EMQX
后端
北极小狐2 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端
ya888g2 小时前
GESP C++四级样题卷
java·c++·算法
【D'accumulation】2 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
小叶学C++2 小时前
【C++】类与对象(下)
java·开发语言·c++