认识 spring AOP (面向切面编程) - springboot


前言

本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
  • [1. 什么是spring AOP?](#1. 什么是spring AOP?)
  • [2. 实现spring AOP - 认识各种通知](#2. 实现spring AOP - 认识各种通知)
  • 总结

本文开始

1. 什么是spring AOP?

AOP: 面向切面编程,也就是面向某一类编程,对某一类事情进行统一处理;

spring AOP: 是实现了AOP这种思想的一个框架;

AOP优点:

  • 减少重复代码:对一类同样的工作统一处理;
  • 提高开发效率:同上;

spring AOP 使用场景

使用:统一用户登录判断; 统一异常处理; 统一日志等等;

认识AOP的组成

  • 切面- Aspect:AOP定义的是一个事件;例如:登录操作的整个过程;- 某个具体功能实现的过程 - 一共类;
  • 切点 - Pointcut:AOP定义的具体规则;例如:验证登录的 方法;- 实现功能的方法 - 类中的方法定义;
  • 连接点 - Join Point:可能触发切点的所有点;- 可能调用功能的某个方法的点;
  • 通知 - Advice:AOP具体执行的方法;例如:方法的具体实现;- 代码具体实现 - 类中方法的具体实现;
    ① 前置通知 @Before
    ② 后置通知 @After
    ③ 环绕通知 @Around
    ④ 异常通知 @AfterThrowing
    ⑤ 返回通知 @AfterReturning

通知执行的顺序:环绕通知之前 > 前置通知 > 方法 > 方法返回后通知 > 后置通知 > 环绕通知之后

2. 实现spring AOP - 认识各种通知

2.1 在springboot项目中,原有依赖 + 添加spring AOP 依赖

2.2 实现过程 定义切面 + 定义切点 + 定义通知

  • 定义切面 -> 定义类
c 复制代码
@Aspect // 定义切面
@Component //随框架启动,注入到容器中
public class UserAspect {
	//定义切点 + 通知...
}
  • 定义切点 -> 定义方法
c 复制代码
//定义切点, 对UserController进行拦截
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
    }//空方法:方法名用于标识

切点表达式:识别该包下类下的任意方法,参数不限;

  • 定义通知:切点的方法名,写在通知参数中,用于识别是哪个切点的通知;(想了解具体的 百度 - AspectJ 语法)
c 复制代码
 //前置通知
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行前置通知!");
    }
//后置通知
    @After("pointcut()")
    public void doAfter() {
        System.out.println("执行后置通知!");
    }
//后置返回后的通知
    @AfterReturning("pointcut()")
    public void doAfterReturn() {
        System.out.println("执行返回后通知!");
    }//抛出异常后通知
    @AfterThrowing("pointcut()")
    public void doAfterThrow() {
        System.out.println("执行抛异常后的通知!");
    }
//环绕通知
    //使用环绕通知:例如:统计时间,就可以使用环绕通知,将通知前 与 通知后 放在一起
    @Around("pointcut()") //ProceedingJoinPoint:获取连接点;执行 =》返回框架,执行
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("执行环绕通知之前!");
        Object result = joinPoint.proceed();
        System.out.println("执行环绕通知之后");
        return result;
    }

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭7 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫24 分钟前
泛型(2)
java
南宫生33 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石41 分钟前
12/21java基础
java
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp1 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗2 小时前
常用类晨考day15
java
骇客野人2 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
AskHarries2 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端