springboot(4)

AOP

1.AOP与OOP

  • OOP(Object Oriented Programming,面向对象编程)

  • AOP(Aspect Oriented Programming,面向切面编程)

  • POP(Process Oriented Programming,面向过程编程)

  • FP(Functional Programming,函数式编程)

AOP的诞生就是为了弥补OOP(面向对象编程)的不足。面向对象非常擅长 解决纵向的业务逻辑,但是对于横向的公共操作却显得有些“力不从心”。

2.用在什么地方

AOP中的核心概念:

  • Advice(通知):想要让AOP做的事情.

  • JoinPoint(连接点):允许AOP通知的地方,比如,在方法被调用前 检查权限,这个“方法被调用前”就是一个JoinPoint.

  • Pointcut(切入点):用于筛选JoinPoint的条件。只有符合Pointcut 条件的JoinPoint才会执行Advice.

  • Aspect(切面):一个包含Advice和Pointcut的集合,完整地定义了 符合什么条件时做什么事。

要想知道AOP可以用在哪些场景,我们需要从AOP其中一个概念入手—— Advice(通知)。我们简单回顾一下。

  • Before:在目标方法执行前调用Advice

  • After[finally]:在目标方法执行完成后调用Advice

  • After-Returning:在目标方法成功执行后调用Advice

  • After-Throwing:在目标方法抛出异常后调用Advice

  • Around:一般解释为环绕/包裹目标方法调用Advice,是可定制化调用 的Advice

AOP的适用场景

Before可以在目标方法执行前做一些事情,如解析请求参数、进行权限检 查等;

After可以在目标方法执行完成后记录一些日志;

After-Returning可以 与Before配合计算目标方法执行时间;

After-Throwing可以在目标方法抛出异 常后做一些处理;

而Around基本上可以做以上所有的事情。

根据AOP的能力与特点,我们通常会在以下场景中使用AOP:

  • 参数检查

  • 日志记录

  • 异常处理

  • 性能统计

除了上面这些基础功能,还可以利用AOP做一些更加复杂的通用处理:

  • 事务控制

  • 缓存处理

  • 权限控制

案例

1.引入AOP依赖

 2.创建AspectController类

 3.创建一个切面类WebAspect:

 

4.在类上加上@Aspect注解,可以用来标识该类为一个AOP的切面。

日志记录

在AspectController类中添加如下接口:

 然后在WebAspect类中添加如下代码

 

before方法中获取了请求路径(path)、完整类路径、目标方法名、参数 信息。after方法中打印了目标方法名。afterReturning方法中打印了目标方 法的返回值。

@Pointcut用来定义切点;execution是用来匹配连接点的执行方法; public代表要匹配访问权限为public的方法;第一个代表返回值为任意 类型;com.shuijing.boot.aop为包路径;第二个代表前面包路径下的任 意类;第三个*代表任意方法;(..)代表任意参数。

4.执行顺序

  • 同一切面内的执行顺序

  • 不同切面间的执行顺序

同一切面内的执行顺序:

先执行 before方法,再执行afterReturning/afterThrowing方法,最后执行after方 法。around方法早于before方法开始执行,并且晚于after方 法结束执行,刚好将其他通知完全包裹了起来

不同切面间的执行顺序:

Spring中默认的执行顺序其实就是Bean初始化的顺序。而Spring中的加载顺序是根据类名升序 排列的,很明显,Three按字母排序会排在Two前面。@Order来解决顺序问题。

5.原理

Spring的AOP是用代理的方式实现的。每个切面都是Spring容器中的一个 Bean,在目标方法被调用时,Spring把切面应用到目标对象上,为目标对象动 态创建代理,这个过程叫作Weaving(织入)。切面会在指定(符合切点条 件)的连接点织入目标对象中。

当调用者调用目标对象时,调用请求会被代理类拦截,而在目标对象真正被调用之前,会先织入切面逻辑。当应用需要目标对象时, Spring才会创建代理对象,因为Spring采用的是运行期织入的实现方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IPC之二:使用命名管道(FIFO)进行进程间通信的例子

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍命名管道(FIFO),命名管道可以完成同一台计算机上的进程之间的通信,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在 …

Pytest测试框架搭建的关键6个知识点(建议收藏)

在现代软件开发中,测试是确保代码质量和功能稳定性的关键步骤。而Pytest作为一个功能强大且易于使用的Python测试框架,为我们提供了一个优雅的方式来编写和管理测试。本文将为你介绍如何构建高效可靠的测试环境,着重探讨Pytest测试框架搭建时…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…

数据结构—树和二叉树

5.树和二叉树 5.1树和二叉树的定义 树形结构(非线性结构):结点之间有分支,具有层次关系。 5.1.1树的定义 树(Tree)是n(n≥0)个结点的有限集。 若n0,称为空树&#x…

文件传输软件的市场现状和未来趋势

文件传输软件是一种能够在不同计算机之间高效、便捷、安全地传送各种类型的文件的应用软件。它是计算机领域中的一项重要技术,涉及到网络通信、数据加密、文件管理等多个方面。随着互联网和移动互联网的发展,文件传输软件的市场需求也日益增大&#xff0…

Linux 中使用 verdaccio 搭建私有npm 服务器

安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功,同时输入verdaccio后verdaccio已经处于运行状态,当然这种启动时暂时的,我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启? 1、打开iPhone苹果手机设置; 2、在iPhone苹果手机设置内找到辅助功能; 3、在辅助功能内找到触控; 4、在iPhone苹果手机辅助功能触控内找到振动,如果是关闭状态请启; …

看门狗文章

1. iwdg.c #include "stm32f4xx.h" #include "iwdg.h"//prer:预分频值 //rlr:自动重装载值 void IWDG_Init(unsigned char prer,unsigned int rlr)//IWDG初始化 {IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);…

你知道音频文件格式转换要用什么软件吗?今天就来分享给你

你是否曾经遇到过这样的情况?你正在享受着一首心爱的歌曲,却突然发现它的音频格式不兼容你的设备或播放器?或者你需要将录音文件从一种格式转换成另一种,以便在不同场景中使用?音频格式转换软件就像是一个通向音乐自由…

林大数据结构【2019】

关键字: 哈夫曼树权值最小、哈夫曼编码、邻接矩阵时间复杂度、二叉树后序遍历、二叉排序树最差时间复杂度、非连通无向图顶点数(完全图)、带双亲的孩子链表、平衡二叉树调整、AOE网关键路径 一、判断 二、单选 三、填空 四、应用题 五、算…

Windows搭建Snort环境及使用方式

目录 0x01 前置环境0x02修改配置文件0x03 自测0x04 使用0x05 感言 0x01 前置环境 环境描述windows10snort2.9.2https://www.snort.org/downloads 先把上面环境下载好! 需要注意的是安装npcap这个软件 0x02修改配置文件 软件安装目录:C:/Snort/ 配置文…

视频添加字幕

1、依靠ffmpeg 命令 package zimu;import java.io.IOException;public class TestSrt {public static void main(String[] args) {String videoFile "/test/test1.mp4";String subtitleFile "/test/test1.SRT";String outputFile "/test/testout13…

dy六神参数记录分析(立秋篇)

version: 23.9 X-SSSTUB: 搜索:x-tt-dt var hashMap Java.use("java.util.HashMap");hashMap.put.implementation function (a, b) {console.log("hashMap.put: ", a, b);return this.put(a, b);}https://codeooo.blog.csdn.n…

河北泛域名https证书可以保护几个域名

什么是泛域名https证书呢?在众多https证书产品中总有几种特别的https证书——泛域名https证书、多域名https证书。通常一张https证书只能保护一个站点,如果想保护多个站点,只能一次给各个站点购买https证书,这种做法虽然解决了问题…

华为云Classroom赋能—TooKit助力开发者上云

对于资深程序员而言,IDE是必不可少的,它好比是剑客手中的宝剑,IDE帮助程序员更快更丝滑的去编程,同时插件就是这把剑上的各种Buff,为宝剑赋能,提供更好的升级打怪体验。 什么是Huawei Cloud Toolkit Huaw…

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目

Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…

MySQL之深入InnoDB存储引擎——redo日志

文章目录 一、为什么需要redo日志二、redo日志的类型1)简单的redo日志类型2)复杂的redo日志类型 三、Mini-Transaction四、redo日志的写入过程五、redo日志文件1、刷盘时机2、redo日志文件组 六、log sequence number1、lsn的引入2、flushed_to_disk_lsn…

生活小妙招之UE custom Decal

因为这几年大部分时间都在搞美术,所以博客相关的可能会鸽的比较多,阿巴阿巴 https://twitter.com/Tuatara_Games/status/1674034744084905986 之前正好看到一个贴花相关的小技巧,正好做一个记录,也在这个的基础上做一些小的拓展…

GATK BaseRecalibratorSpark 过程中因Too many open files终止

Error: GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令: nohup time ./gatk --java-options "-Xmx16G" BaseRecalibratorSpark -R ../../alignment/hg38/hg38.fa -I ../../alignment/bam/P368T.sorted.markdup.bam …

【Ubuntu】Ubuntu 22.04 升级 OpenSSH 9.3p2 修复CVE-2023-38408

升级原因 近日Openssh暴露出一个安全漏洞CVE-2023-38408,以下是相关资讯: 一、漏洞详情 OpenSSH是一个用于安全远程登录和文件传输的开源软件套件。它提供了一系列的客户端和服务器程序,包括 ssh、scp、sftp等,用于在网络上进行…
最新文章