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


前言

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


文章目录

  • 前言
  • 1. 什么是spring AOP?
    • AOP优点:
    • spring AOP 使用场景
    • 认识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 实现过程 定义切面 + 定义切点 + 定义通知

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

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

在这里插入图片描述

  • 定义通知:切点的方法名,写在通知参数中,用于识别是哪个切点的通知;(想了解具体的 百度 - AspectJ 语法)
 //前置通知@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;}

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速上手字符串函数

文章目录 前言一、求字符串的长度strlen函数strlen函数学习使用strlen函数模拟实现strlen函数模拟实现方法1:计数器法strlen函数模拟实现方法2:指针减指针法strlen函数模拟实现方法3:递归方法 二、字符串的拷贝,拼接和比较strcpy函…

C高级 作业 day3 8/4

1.整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 1 #!/bin/bash2 arr(ls -l ~ | cut -d r -f 1 | grep -w d )3 arr1(ls -l ~ | cut -d r -f 1 | grep -w -)4 echo "目录文件个数为 ${#arr[*]}"5 echo "普通文件个数为 ${#arr1[*]}&q…

数据可视化(5)热力图及箱型图

1.热力图 #基本热力图 #imshow(x) #x,数据 x[[1,2],[3,4],[5,6],[7,8],[9,10]] plt.imshow(x) plt.show() #使用热力图分析学生的成绩 dfpd.read_excel(学生成绩表.xlsx) #:表示行号 截取数学到英语的列数 xdf.loc[:,"数学":英语].…

CS 144 Lab Five -- the network interface

CS 144 Lab Five -- the network interface TCP报文的数据传输方式地址解析协议 ARPARP攻击科普 Network Interface 具体实现测试tcp_ip_ethernet.ccTCPOverIPv4OverEthernetAdapterTCPOverIPv4OverEthernetSpongeSocket通信过程 对应课程视频: 【计算机网络】 斯坦福大学CS144…

OA办公自动化系统设计与实现(论文+源码)_kaic

摘要 随着信息化建设的日益深入,无论是政府还是企事业单位,部门之间的信息沟通与协调工作越来越重要。人们迫切需要一个能充分利用网络优势,并可以管理企业的各种重要信息的软件平台,利用该平台快速建立自己的信息网络和办公管理系…

云运维工具

企业通常寻找具有成本效益的方法来优化创收,维护物理基础架构以托管服务器和应用程序以提供服务交付需要巨大的空间和前期资金,最重要的是,物理基础设施会产生额外的运营支出以进行定期维护,这对收入造成了沉重的损失。 云使企业…

docker安装neo4j

参考文章: 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候,参考了以上文章。遇到了一些问题,记录下自己的安装过程: …

全志F1C200S嵌入式驱动开发(从DDR中截取内存)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 linux内核起来的时候,不一定所有的内存都是分配给linux使用的。有的时候,我们是希望能够截留一部分内存的。为什么保留这部分内存呢?这里面可以有很多的用途。比如说,第一,如果…

CSS 高频按钮样式

CSS 高频按钮样式 矩形与圆角按钮 正常而言&#xff0c;我们遇到的按钮就这两种 -- 矩形和圆角&#xff1a; 它们非常的简单&#xff0c;宽高和圆角和背景色。 <div classbtn rect>rect</div><div classbtn circle>circle</div>.btn {margin: 8px aut…

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;属于行为型模式&#xff0c;是用来降低…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…

Android 实现账号诊断动画效果,逐条检测对应的项目

Dialog中的项目 逐条检测效果&#xff1a; 依赖库&#xff1a; implementation com.github.li-xiaojun:XPopup:2.9.19 implementation com.blankj:utilcodex:1.31.1 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.101、item_account_check.xml <…

Vue [Day3]

Vue生命周期 生命周期四个阶段 生命周期函数&#xff08;钩子函数&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale…

Three.js入门

Three.js 介绍 Three.js 是一个开源的应用级 3D JavaScript 库&#xff0c;可以让开发者在网页上创建 3D 体验。Three.js 屏蔽了 WebGL的底层调用细节&#xff0c;让开发者能更快速的进行3D场景效果的开发。 Three.js的开发环境搭建 创建目录并使用npm init -y初始化package…

Containerd容器镜像管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd镜像管理 1.1 Containerd容器镜像管理命令 docker使用docker images命令管理镜像单机containerd使用ctr images命令管理镜像,con…

无涯教程-Lua - 文件I/O

I/O库用于在Lua中读取和处理文件。 Lua中有两种文件操作&#xff0c;即隐式(Implicit)和显式(Explicit)操作。 对于以下示例&#xff0c;无涯教程将使用例文件test.lua&#xff0c;如下所示。 -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用以下语句。…

【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

文章目录 1.模拟实现list1.1构造函数1.2迭代器类的实现1.3运算符重载1.4增删查改 1.模拟实现list list使用文章 1.1构造函数 析构函数 在定义了一个类模板list时。我们让该类模板包含了一个内部结构体_list_node&#xff0c;用于表示链表的节点。该结构体包含了指向前一个节点…

git之reflog分析

写在前面 本文一起看下reflog命令。 1&#xff1a;场景描述 在开发的过程中&#xff0c;因为修改错误&#xff0c;想要通过git reset命令恢复到之前的某个版本&#xff0c;但是选择提交ID错误&#xff0c;导致多恢复了一个版本&#xff0c;假定&#xff0c;该版本对应的内容…

Springboot部署ELK实战

Springboot部署ELK实战 1、部署docker、docker-compose环境安装docker安装docker-compose 2、搭建elk1、构建目录&&配置文件1、docker-compose.yml 文档2、Kibana.yml3、log-config.conf 2、添加es分词器插件3、启动 3、Springboot项目引入es、logStash配置1、引入依赖…

【新人指南】给新人软件开发工程师的干货建议

在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的成本。 这篇文章根据我多年的工作经验&#xff0c;给新人总结了一些建议&#xff0c;希望对你会有所帮助。 写好注释 没有注…