Spring AOP

文章目录

    • 一、什么是AOP
    • 二、AOP可以实现什么
    • 三、AOP的优点
    • 四、简单实现Spring AOP
      • 1.AOP的组成
      • 2. 五个通知
      • 3.Spring AOP实现步骤

一、什么是AOP

AOP指的是面向切面编程,是对某一类事情的集中处理。比如用户登录权限的校验,在传统的代码中,所有需要判断用户登录的页面都要各自实现判断用户登录状态的方法。但是有了AOP后,会进行统一的用户登录验证,(类似于高铁站的安检系统)。由此,所有需要用户登录验证的页面都可以实现用户登录验证了。不需要在各自页面写很多相同的方法。

Spring AOP是一个AOP框架,它实现了AOP的思想。

二、AOP可以实现什么

  • 用户登录判断
  • 统⼀⽇志记录
  • 统⼀⽅法执⾏时间统计
  • 统⼀的返回格式设置
  • 统⼀的异常处理
  • 事务的开启和提交等

三、AOP的优点

在谈到AOP的优点前,首先举一个日常生活中的例子。比如我们出行。有的火车站既有火车,也有动车,还有高铁。进站前进行安检。如果火车弄火车的安检系统,高铁弄高铁的是非常麻烦的,而且没有必要。因为他们的目的是一样的,都是对进站人员进行安检,为什么不合并呢?这时,AOP思想的优势就出来了。甭管它是什么车,我都统一安检。

对于这种功能统⼀,且使⽤的地⽅较多的功能,使用 AOP来统⼀处理会方便的多。

四、简单实现Spring AOP

1.AOP的组成

  1. 切面 Aspect
    定义的是具体事件。AOP是做啥的。
    比如:用户登录判断

  2. 切点 Pointcut
    定义的是具体规则。
    比如:用户登录拦截规则(哪些接口需要判断用户登录状态)

  3. 通知 Advice
    AOP执行的具体方法
    比如:获取用户信息,如果有,说明以及登录。如果没有,表示未登录。

  4. 连接点 Join Poit
    有可能出发切点的所有点
    比如:所有的接口

2. 五个通知

  1. 前置通知
  2. 后置通知
  3. 环绕通知
  4. 异常通知
  5. 返回通知

3.Spring AOP实现步骤

  1. 在pom.xml中添加Spring AOP依赖


org.springframework.boot
spring-boot-starter-aop

  1. 定义切面和切点
    Spring AOP_第1张图片

切点表达式说明:
execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)

  1. 定义通知

Spring AOP_第2张图片
执行结果

Spring AOP_第3张图片
完整代码:

AOP的实现:

  • UserAspect代码:
package com.example.demo.common;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect //该类是一个切面
@Component //随着spring框架的启动而启动
public class UserAspect {
    //定义一个切点,切点中定义拦截的规则,这里使用AspectJ表达式语法
    @Pointcut("execution(* com.example.demo.controller.UserController.* (..))")
    public void pointcut(){}

    //针对哪个切点,写切点的方法名就可
    @Before("pointcut()") //前置通知
    public void doBefore(){
        System.out.println("前置通知");
    }

    @After("pointcut()") //后置通知
    public void doAfter(){
        System.out.println("前置通知");
    }

    @Around("pointcut()")//环绕通知
    public Object doAround(ProceedingJoinPoint joinPoint){
        Object obj=null;
        System.out.println("执行环绕通知前");
        try{
            //执行拦截方法
            obj=joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("执行环绕通知后");
        return obj;
    }
}

  • UserController类:
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/haha")
    public String haha(){
        return "哈哈哈";
    }

}

总结

祝大家顺顺利利健健康康天天开心,下次见!!!

你可能感兴趣的:(spring,java,后端)