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


相关推荐
叠叠乐4 分钟前
robot_state_publisher 参数
java·前端·算法
Kiri霧5 分钟前
Range循环和切片
前端·后端·学习·golang
过期动态6 分钟前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
WizLC8 分钟前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Mr.朱鹏10 分钟前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
小张快跑。14 分钟前
【Java企业级开发】(十一)企业级Web应用程序Servlet框架的使用(上)
java·前端·servlet
星星不打輰14 分钟前
SSM项目--SweetHouse 甜蜜蛋糕屋
java·spring·mybatis·ssm·springmvc
Victor35614 分钟前
Netty(19)Netty的性能优化手段有哪些?
后端
Knight_AL19 分钟前
Java 线程池预热(Warm-up)实战:开启与不开启到底差多少?
java·开发语言
爬山算法21 分钟前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
java·后端