SpringAOP——基础知识

news2024/12/26 23:21:35

AOP

AOP全称是Aspect Oriented Programming 即面向切面编程,是对一类统一事务的集中处理
例如,我们的网页许多地方都需要进行登陆验证,这时就需要在很多地方添加重复的验证代码,而AOP可以集中配置需要登陆验证的地方,就可以简化我们的代码

除此以外还可以实现:

  • 统一日志的记录
  • 统一方法执行的时间记录
  • 统一返回格式的设置
  • 统一异常的处理
  • 事务的开启和提交

springAOP

就像IoC是思想,而DI是实现,SpringAOP也是对AOP这种思想的实现

基本组成

  • 切面:用来处理问题的一个类,包含切点和通知的相关方法
  • 切点:用来设置拦截的规则
  • 通知:程序拦截后进行的具体操作
  • 连接点:触发AOP相关规则的点

其中对于通知,还有下面几种不同的分类:

  1. 前置通知: 使用@Before注解,在目标方法执行前执行
  2. 后置通知:使用@After注解,在目标方法返回或抛出异常后执行
  3. 返回通知:使用@AfterRetruning注解,在目标方法返回后执行
  4. 异常通知:使用@AfterThrowing注解,在目标方法抛出异常后执行
  5. 环绕通知:使用@Around注解,在包裹的方法执行前后执行后执行
    在这里插入图片描述

也就是说,page1,2,3是需要验证是否登陆的页面,也就是连接点
验证是否登陆的这个方法就是切点
处理用户登陆问题是通知
而整个验证用户登陆的这个行为,称为切面

实现

首先在程序中加入SpringAOP的相关依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo
ot-starter-aop -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在程序中专门建一个类用来存储切面

@Aspect
@Component
public class 切面方法名{
	@Poiontcut("execution(修饰符 返回类型 包名.类名.方法名(参数) 异常)")
	public void 切点方法名(){}
}

其中Aspect注解代表此类是切面
而Component注解使该类在运行时启动

这里的切点方法并没有具体的实现,只是用来为通知方法标明执行的是那个切点

而@Pointcut注解后面的表达式则是标明拦截的规则

并且,表达式中还支持通配符:

  • *匹配任意字符,只匹配一个元素
  • …匹配任意字符,匹配多个元素
  • +匹配指定类及其子类

也就是说:

修饰符

例子表达
public匹配所有公共方法
*匹配所有方法

返回值(不能省略)

例子表达
String匹配所有返回String的方法
*匹配所有方法

包名

例子表达
com.example.demo匹配com.exaple.demo这个包
com.*.demo匹配前面是com,结尾是demo的包
com.demo…匹配com下面的所有子包

类名

例子表达
User匹配User类
User*匹配以User开头的类
*匹配所有类

方法名(不能省略)

例子表达
getUser匹配getUser这个方法
*getUser匹配以getUser结尾的方法
*匹配所有方法

参数

例子表达
()匹配没有参数的方法
(int, float)匹配一个int,一个float参数的方法
(…)匹配任意类型的参数

例如:
定义一个匹配com.example.demo.controller包下,UserController的任意方法

@Component //随框架启动而启动
@Aspect //切面类
public class UserAspect {

    /**
     * 定义切点
     */
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){
    }
}

实现通知

前置通知

/**
 * 前置通知
 */
@Before("pointcut()")
public void beforeAdvice(){
    System.out.println("执行前置通知");
}

后置通知

/**
 * 后置通知
 */
@After("pointcut()")
public void afterAdvice(){
    System.out.println("执行后置通知");
}   

环绕通知

/**
 * 环绕通知
 */
@Around("pointcut()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint){
    System.out.println("进入环绕通知");

    Object object = null;
    try{
    	//执行拦截方法
        object = joinPoint.proceed();
    } catch (Throwable e) {
        e.printStackTrace();
    }

    System.out.println("结束环绕通知");
    return object;
}

返回通知

@AfterReturning("pointcut()")
public void returnAdvice(){
    System.out.println("执行返回通知");
}

异常通知

@AfterThrowing("pointcut()")
public void throwAdvice(){
    System.out.println("执行抛出异常通知");
}

把UserController类定义出来,验证一下这些通知是否执行

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(String name){
        System.out.println("执行sayHi方法");
        return "hi" + name;
    }

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("执行sayHello方法");
        return "hello world";
    }
}

在访问127.0.0.1:8080/user/hi页面时,程序台就会打印如下信息
在这里插入图片描述

实现原理

springAOP只支持方法级别的拦截,这是因为其基于动态代理实现
其中分别用JDK Proxy(实现接口的类生成代理类),和CGLIB(没实现接口的类生产代理类)

把切面连接到目标对象的相关位置(连接点)的行为叫织入

其中一般在目标对象的这几个时期织入

  • 编译器
  • 类加载期
  • 代码运行期(SpringAOP实现方式)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单认识: 数据库 zhi 操作(MySQL为例)

目录 前言 一&#xff0c;库 二&#xff0c;站在巨人的肩膀上理解 库 的操作 下节预告&#xff1a; 前言 今天是库库森日记第n……篇之数据库篇一 库 库 库~~~~的~操~作。 如果看完这篇文章&#xff0c;你觉得数据库从简单的创建库&#xff0c;表&#xff0c;修改…

世界那么大,你哪都别去了,来我带你了解CSS3 (一)

文章目录‍❤️‍&#x1f525;CSS简介‍‍‍‍❤️‍&#x1f525;CSS选择器❣️选择器一❣️选择器二❣️关系选择器‍❤️‍&#x1f525;CSS属性❣️字体属性❣️背景属性❣️文本属性❣️表格属性‍❤️‍&#x1f525;CSS简介 CSS概念 CSS&#xff08;Cascading Style Sh…

JWT续期问题,ChatGPT解决方案

JWT&#xff08;JSON Web Token&#xff09;通常是在用户登录后签发的&#xff0c;用于验证用户身份和授权。JWT 的有效期限&#xff08;或称“过期时间”&#xff09;通常是一段时间&#xff08;例如1小时&#xff09;&#xff0c;过期后用户需要重新登录以获取新的JWT。然而&…

数据结构基础之链表

目录 前言 1、什么是链表 2、添加元素 3、虚拟头结点 4、查询&修改元素 5、删除元素 附&#xff1a;完整代码 前言 又到周末了&#xff0c;修整了一天&#xff0c;继续来写点东西吧&#xff0c;今天&#xff0c;我们来学习数据结构中的另一种基础的数据结构——链表…

jsp进阶

文章目录jsp进阶内容回顾JSP 的九大内置对象内置对象的创建九大内置对象详解四大作用域对象四大作用域范围总结EL 进阶JSTL 标准标签库JSTL 核心标签jsp进阶 内容回顾 jsp 创建 jsp 的工作原理&#xff1a;翻译 --> 编译 --> 运行 翻译&#xff1a;第一次访问 jsp 页面…

Redis简单笔记

1 为什么需要Redis 数据分冷热&#xff0c;将热数据存储到内存中 2 Redis应用案例 2.1 连续签到 2.1.1 String数据结构 可以存储字符串、数字、二进制数据通常和expire配合使用场景:存储计数、Session2.2 消息通知 用list作为消息队列 使用场景:消息通知。 例如当文章更新时…

机器学习模型的可解释性算法汇总!

模型可解释性汇总简 介目前很多机器学习模型可以做出非常好的预测&#xff0c;但是它们并不能很好地解释他们是如何进行预测的&#xff0c;很多数据科学家都很难知晓为什么该算法会得到这样的预测结果。这是非常致命的&#xff0c;因为如果我们无法知道某个算法是如何进行预测&…

巴别塔——问答平台调研

项目内容这个作业属于哪个课程2023 年北航软件工程这个作业的要求在哪里个人作业-软件案例分析我在这个课程的目标是了解软件工程的方法论、获得软件项目开发的实践经验、构建一个具有我的气息的艺术品这个作业在哪个具体方面帮助我实现目标对于“程序员是什么”这个问题有了一…

【ChatAug: Leveraging ChatGPT for Text Data Augmentation 论文精读】

ChatAug: Leveraging ChatGPT for Text Data Augmentation 论文精读InformationAbstract1 Introduction2 RELATED WORK2.1 Data Augmentation2.2 Few-shot Learning2.3 Very Large Language Models2.4 ChatGPT: Present and Future3 DATASET3.1 Symptoms Dataset3.2 PubMed20k …

Qt扫盲-CMake 使用概述

CMake 使用概述一、概述二、创建Qt CMake 项目三、简单介绍1. 引入Qt的库2.Qt CMake 引入第三方库3. Qt CMake 项目目录四、使用案例一、概述 CMake是一个简化跨不同平台开发项目的构建过程的工具。对C来说其实就是生成一个文件&#xff0c;文件里面描述了&#xff0c;怎么组织…

【MyBatis】MyBatis操作数据库

MyBatis操作数据库 文章目录MyBatis操作数据库:one:什么是MyBatis:two:创建SSM项目引入依赖配置文件设置MyBatis底层逻辑:three:实现CRUD功能查询全列查询带参数的查询新增获取自增主键删除更新:four:参数占位符&#xff1a;#{}和${}不支持String参数问题${}使用场景&#xff1…

javascript的ajax

学什么Ajax基础JSON跨域XHR对象Ajax进阶Ajax应用Ajax扩展Ajax基础初识 AjaxAjax的基本用法GET请求POST请求JSON初识JSONJSON的3种形式JSON的常用方法跨域初识跨域CORS跨域资源共享JSONPXHR 对象XHR的属性XHR的方法XHR的事件Ajax进阶FormData封装Ajax使用Promise改造封装好的Aja…

Linux 进程:进程退出返回值的获取

目录一、对输出参数status的理解二、获取进程退出返回值1.位运算(1)异常退出码(2)进程返回值2.宏函数我们常使用函数 wait 和 waitpid 来执行进程等待的功能&#xff1a;处理退出的子进程并释放资源&#xff0c;防止子进程变成僵尸进程。而这两个函数都有一个输出参数status&am…

【LeetCode】第 99 场双周赛

1. 最小和分割 给你一个二维整数数组 ranges &#xff0c;其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间&#xff08;包括二者&#xff09;的所有整数都包含在第 i 个区间中。 你需要将 ranges 分成 两个 组&#xff08;可以为空&#xff09;&#xff0c;满足&am…

单板TVS接地不当造成辐射骚扰超标问题分析-EMC

【摘要】 某产品EMC辐射骚扰测试超标&#xff0c;通过近远场扫描配合定位分析&#xff0c;逐步找出骚扰源、传播路径&#xff0c;最终通过修改 PCB 走线切断传播路径解决此问题。 1 故障现象 某产品在进行 EMC 研发摸底测试时发现&#xff0c;整机辐射骚扰垂直方向测试超标&a…

Cesium实现的光柱效果

Cesium实现的光柱效果 效果展示: 可以通过拼接两个entity来实现这个效果: 全部代码; index.html <!DOCTYPE html> <html><head><meta charset

HBase写入流程详解

HBase采用LSM树架构&#xff0c;天生适用于写多读少的应用场景。在真实生产线环境中&#xff0c;也正是因为HBase集群出色的写入能力&#xff0c;才能支持当下很多数据激增的业务。需要说明的是&#xff0c;HBase服务端并没有提供update、delete接口&#xff0c;HBase中对数据的…

C++实战md5、base64算法实现(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、常用加密算法1. md5是什么二、源码1. md52. base64、decode总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务…

WebStorm + JetBrains IDE Support 实现自动刷新功能

找了半天&#xff0c;还借了朋友一个vpn,然后发现&#xff1a; JetBrains IDE Support已经下架&#xff1a; 关于插件JetBrains IDE Support在chrome商店中消失_webstorm启动chrome没有插件_kesin_lee的博客-CSDN博客 在写Html网页时&#xff0c;参考WebStrom说明文档&#xf…

【MySQL】P1 数据库基础以及MySQL下载安装

MySQL数据库基本概念MySQLSQL 简介前言 本篇博文为 MySQL 系列博文第一弹&#xff0c;主要围绕数据库基本概念&#xff0c;MySQL数据库下载安装以及SQL分类进行介绍。 下一篇博文将围绕 DDL 进行学习记录。 链接&#xff1a; 正文 数据库基本概念 数据库&#xff1a;存储数据…