当前位置: 首页 > news >正文

Spring Boot Aop初接触

AOP(面向切面编程),或多或少都听过一点。名字比较怪,切面,不容易理解,但其中真正含义,无非就是旁路控制,非侵入式编码之类。比如我想加个操作日志功能,利用AOP,无须每个操作都加一个记录功能,只需写一个,就惠泽全部。

这个是怎么做到的呢?也没有太玄妙的东西,原理类似于过滤器、拦截器,在底层和全局性的地方做了处理,各个业务功能都流经这些关卡。
在这里插入图片描述

一、过滤器、拦截器与AOP

据说,过滤器、拦截器、AOP三者功能类似,但各有优势,从过滤器 》拦截器 》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、切面。一般情况下数据被过滤的时机越早对服务的性能影响越小,因此我们在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是AOP。

AOP使用的主要是动态代理 , 过滤器使用的主要是函数回调;拦截器使用是反射机制 。一个请求过来,先进行过滤器处理,看程序是否受理该请求 。 过滤器放过后 , 程序中的拦截器进行处理 ,处理完后进入 被 AOP动态代理重新编译过的主要业务类进行处理 。

Filter:和框架无关,过滤器拦截的是URL,可以控制最初的http请求,但是更细一点的类和方法控制不了。

Interceptor:拦截器拦截的也是URL,拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。

AOP:面向切面拦截的是类的元数据(包、类、方法名、参数等) 相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。

二、Spring Boot中应用AOP

1、pom.xml

引入依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、面向切面类

1)写一个方法用于测试

为方便测试,写一个控制器。再简单不过的控制器。

TestController.java

package com.chenqu.bullshit.modules.work.controller;@RestController
@RequestMapping("test1")
public class TestController {@ResponseBody@RequestMapping("/hello")public String sayHello(){System.out.println("hello");return "hello";}
}

2)面向切面的类

然后写一个面向切面的类。就像配置、过滤器、拦截器一样,写出来之后,系统(准确来说,应该是容器?)会自动解释它,于是面向切面开始生效。

TestAdvice.java

@Aspect
@Component
public class TestAdvice {//指示哪些方法将会受到影响。Pointcut,切入点@Pointcut("execution (* com.chenqu.bullshit.modules.work.controller.TestController.*(..))")public void test1() {}@Before("test1()")public void beforeAdvice() {System.out.println("beforeAdvice...");}@After("test1()")public void afterAdvice() {System.out.println("afterAdvice...");}@Around("test1()")public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("before");try {proceedingJoinPoint.proceed();} catch (Throwable t) {t.printStackTrace();}System.out.println("after");}
}

上述代码中,首先类使用了标注“@Aspect”,表明这是一个面向切面的类。

类中void test1()使用了标注“@Pointcut”。Pointcut者,切入点也。它里面的内容,指示了哪些方法将会受到影响。在这里,指向了我们用于测试的控制器。如果是想指向所有的控制器,可以这样写:

@Pointcut("execution (* com.chenqu.bullshit.modules.work.controller.*.*(..))")

在这里插入图片描述
至于其他的什么@Before、@After、@Arround,无非就是切入前执行、切入后执行、切入时执行,顾名思义。

运行代码,用浏览器访问

http://localhost:8090/test1/hello

控制台输出如下:
在这里插入图片描述

3、execution 与 annotation

execution与annotation都是Pointcut的2种常用执行方式,除此而外,还有什么within、this、target之类乱七八糟的,一大群,让人头大。常用的就是execution与annotation。execution如上例,就是指明会影响哪些方法;而annotation是注解的意思,指明会影响带哪些注解的方法,或者说,如果方法带上指定的注解,就会受到影响。

1)添加一个名为NeedTest的注解

NeedTest.java

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NeedTest {String value() default "";
}

2)然后将上面例子中TestAdvice.java,Pointcut的执行方式由execution 改为 annotation,其余保持不变。

@Aspect
@Component
public class TestAdvice {@Pointcut("@annotation(com.chenqu.bullshit.modules.annotation.NeedTest)")public void test1() {}@Before("test1()")public void beforeAdvice() {System.out.println("beforeAdvice...");}@After("test1()")public void afterAdvice() {System.out.println("afterAdvice...");}@Around("test1()")public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("before");try {proceedingJoinPoint.proceed();} catch (Throwable t) {t.printStackTrace();}System.out.println("after");}}

3)修改用于测试的控制器TestController.java,方法带上@NeedTest注解

package com.chenqu.bullshit.modules.work.controller;@RestController
@RequestMapping("test1")
public class TestController {@NeedTest@ResponseBody@RequestMapping("/hello")public String sayHello(){System.out.println("hello");return "hello";}
}

运行结果跟上面一样,效果一致。

三、小结

从网上搜索出来的,有关spring boot aop的使用资料,绝大部分都很难懂。说了一大堆,根本不知道在说什么,也许作为手册供查阅是极好的。本文从我个人学习的角度出发,记录一下心得。

参考文章:
Spring Boot使用AOP的正确姿势

相关文章:

Spring Boot Aop初接触

AOP&#xff08;面向切面编程&#xff09;&#xff0c;或多或少都听过一点。名字比较怪&#xff0c;切面&#xff0c;不容易理解&#xff0c;但其中真正含义&#xff0c;无非就是旁路控制&#xff0c;非侵入式编码之类。比如我想加个操作日志功能&#xff0c;利用AOP&#xff0…...

【创作赢红包】LeetCode:232. 用栈实现队列

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;232. 用栈实现队列 题目描述&#xff1a;请你仅使用两个栈实现先入先出队…...

Mybatis+Mysql 实现向下递归查询

介绍 说到递归查询&#xff0c;大家可以想到的技术实现方式主要如下几种&#xff1a; 1、各种主流应用开发语言本身通过算法实现 2、各种数据库引擎自身提供的算法实现 本文提到主要是针对第二种和第一种的结合 主要技术栈 1、ORM&#xff1a;Mybatis 2、DB&#xff1a;MyS…...

python@调用系统命令行@os.system@subprocess@标准输入输出@sys.stdin@sys.stdout@input@print

文章目录python调用系统命令行os.system标准输入输出sys.stdinsys.stdoutinputprint概要os.systemdemoswindows命令解释器ComSpecsubprocessrecommended&#x1f388;基本用法demos标准输入输出sys.stdininput()sys.stdin.inputinput()交互模式小结sys.stdoutsys.stdout.wirte(…...

手握数据智能密钥,诸葛智能打开数字化经营“三重门”

科技云报道原创。 如果说上世纪传统麦迪逊大街上的“广告狂人”吸金立足之本&#xff0c;还主要是基于“Big Idea”的话&#xff0c;那么在当下&#xff0c;数据正在成为企业营销和运营的金矿。 这是一个“人与机器共同进化”的时代&#xff0c;技术作为延伸人类感觉的媒介之…...

C语言可以实现各种滤波算法

C语言可以实现各种滤波算法&#xff0c;以下是一些常见的滤波算法&#xff1a; 均值滤波&#xff08;Mean Filter&#xff09;&#xff1a;将图像中每一个像素周围一定区域内的灰度值取平均值作为该像素的新灰度值&#xff0c;用于去除高斯噪声等随机噪声。 下面是一个简单的 C…...

使用Netty,当然也要了解它的连接闲置处理

连接闲置网络连接的闲置指的是当前网络连接处于空闲状态&#xff0c;即没有正在进行的数据传输或通信活动。当我们的某个连接不再发送请求或者接收响应的时候&#xff0c;这个连接就开始处于闲置状态。网络连接的闲置时间越长&#xff0c;说明该连接越不活跃。此时&#xff0c;…...

2、K-Planes

运行配置 主页&#xff1a;https://sarafridov.github.io/K-Planes/ 代码&#xff1a;https://github.com/sarafridov/K-Planes 预训练权重&#xff1a;https://drive.google.com/drive/folders/1zs_folzaCdv88y065wc6365uSRfsqITH Neural_3D_Video_Dataset&#xff1a;htt…...

张文海教授课题组在国际高水平期刊《Cerebral Cortex》发表研究成果

调节悲伤情绪对于维持伴侣间的浪漫关系至关重要。人际情绪调节策略包括情感参与&#xff08;AE&#xff09;和认知参与&#xff08;CE&#xff09;&#xff0c;这两种策略在浪漫关系中效用如何&#xff1f;它们是如何通过情感纽带调节伴侣情绪的&#xff1f;其背后的脑际神经互…...

ffmpeg4.1 源码学习之-转封装

前言 ffmpeg 的源码量非常的多&#xff0c;而且非常繁杂&#xff0c;非常多的函数&#xff0c;如果一个函数一个函数看的话要花费比较多的时间。所以本文通过跟踪ffmpeg转封装的过程来学习ffmpeg的源码具体转封装的命令&#xff1a;ffmpeg -i 1_cut.flv -c copy -f mp4 1.mp4在…...

ChatGPT写作文章-快速使用ChatGPT不用注册方式

如何更好地使用ChatGPT批量生成文章&#xff1a;详细教程 作为一款强大的文本生成器&#xff0c;ChatGPT可以帮助您快速、高效地批量生成文章。但如果您还不知道如何更好地使用ChatGPT&#xff0c;那么这篇详细的列表教程将会指导您如何使用它来生成高质量的文章&#xff0c;提…...

Nginx配置ip白名单(服务权限控制)

Nginx服务器权限控制&#xff1a;Nginx 是一款高性能的 HTTP 和反向代理服务器。它可以通过配置文件实现权限控制&#xff0c;从而限制或允许特定的 IP 地址、网络或用户访问指定的资源。这里是一些基本的 Nginx 权限控制方法&#xff1a; 1. 基于 IP 地址的访问控制 在 Ngin…...

Vue 核心(二)

文章目录Vue 核心&#xff08;二&#xff09;八、 绑定样式1、 class2、 style九、 条件渲染1、 渲染指令2、 使用示例十、 列表渲染1、 基本语法2、 key原理3、 列表过滤4、 列表排序5、 数组更新检测6、 大总结十一、 收集表单数据十二、 内置指令1、 v-text2、 v-html3、 v-…...

犯罪现场还原虚拟vr训练平台突破各种教学限制

在当今社会矛盾日益凸显、各式犯罪层出不穷的背景下&#xff0c;创新改革公安院校实战化教学方式&#xff0c;强化对基层公安队伍实战化应用型人才的供给能力具有重要性、紧迫性。 案件现场勘查是门技术活&#xff0c;如何让民警快速有效提升技能、服务实战? 常规刑侦专业现场…...

LeetCode 617. 合并二叉树 | C++语言版

LeetCode 617. 合并二叉树 | C语言版LeetCode 617. 合并二叉树题目描述解题思路思路一&#xff1a;使用递归代码实现运行结果参考文章&#xff1a;思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a;LeetCode 617. 合并二叉树 题目描述 题目地址&#xf…...

Python量化交易08——利用Tushare获取日K数据

总有同学问我要数据...很多第三方接口都能直接获取数据的&#xff0c;本次介绍怎么用Tushare库获取A股日k线行情的数据。 Tushare有两个版本&#xff0c;老版现在快弃用了。 新版的官网链接在这&#xff1a;Tushare数据 需要注册一个账号&#xff0c;然后改一下资料&#xff0…...

30张精美可视化大屏,无需代码直接套用,解决你95%的大屏需求!

通常制作可视化大屏&#xff0c;一般有两种方式 代码开发&#xff1a;写代码调用数据和图表库&#xff0c;比如写JSEcharts &#xff1b; 可视化工具&#xff1a;用现成的数据可视化工具 前者简单直接&#xff0c;直接写代码就完事。但对于大部分人来说门槛较高&#xff0c;维…...

TCP网络事件模型的封装1.0

TCP网络模型的封装 最近学习了TCP网络模型的封装&#xff0c;其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型&#xff0c;不禁感叹原来代码还能这样写&#xff1f;神奇&#xff01; 为此将源码分享出来并将流程图画出&#xff0c;方便…...

NC271.二叉搜索树的后序遍历序列

文章目录一、题目描述二、示例三、主要思路一、题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 提示&#xff1a; 1.二叉搜索树是指父亲节点大于左子树中…...

研究fastdds v2.8.0 1之 基础模块

阅读 dds 协议 1.4 版本 &#xff0c; 结合fastdds 2.8 的代码理解dds。 Entity 理解 DCPS基础设施模块由以下类组成&#xff1a; Entity DomainEntity QosPolicy Listener Status WaitSet Condition GuardCondition StatusCondition1、Entity 是所有DCPS 对象的基础类 virt…...

认知通量(CT):用语义带宽、时序保真度与概念熵减重构AI训练评估

1. 项目概述&#xff1a;这不是又一个“大模型参数秀”&#xff0c;而是一次对AI认知边界的重新测绘“From 1T Tokens to Total Cognition: The Numbers Behind the New AI Brain…”——这个标题里没有一个生僻词&#xff0c;但组合在一起&#xff0c;却像一把钥匙&#xff0c…...

xc-union 从 1.0.0 到 2.0.0:开源私域返利基座

618 拼的不只是流量&#xff0c;更是开发效率。 每到大促节点&#xff0c;很多团队都会集中遇到同一类需求&#xff1a; 查券/导购工具要尽快上线H5 页面先跑&#xff0c;后端接口后续持续扩展要求可快速交付&#xff0c;也要支持后续二开 问题是&#xff0c;如果从零开始手撸&…...

福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;福建话TTS落地难&#xff1f;手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案&#xff0c;限时可复现 ElevenLabs 官方 API 当前仅支持普通话、粤语等主流中文变体&#xff0c;对闽东方言&a…...

抖音批量下载神器:5分钟掌握高效内容采集的终极指南

抖音批量下载神器&#xff1a;5分钟掌握高效内容采集的终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

Android NDK/JNI开发深度指南:从基础到实战

引言 在移动应用开发领域,Android平台以其开放性和灵活性著称。然而,当应用需要处理高性能计算、图像处理、游戏引擎或重用现有C/C++库时,纯Java实现可能面临性能瓶颈。这时,Native Development Kit(NDK)和Java Native Interface(JNI)成为关键工具。NDK允许开发者使用…...

【ElevenLabs老挝文语音实战指南】:2024年唯一经实测验证的8步本地化语音合成落地方案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ElevenLabs老挝文语音合成的技术背景与本地化价值 ElevenLabs 作为全球领先的AI语音生成平台&#xff0c;长期聚焦于高保真、情感化多语言语音合成技术。尽管其支持语言列表持续扩展&#xff0c;老挝文&#x…...

D1094UK,500MHz频段下20W高功率输出的单端式硅RF MOSFET射频晶体管

简介今天我要向大家介绍的是 TT Electronics / Semelab 的硅RF MOSFET晶体管——D1094UK。这是一款专为VHF/UHF通信频段设计的单端式射频功率场效应管&#xff0c;在28V工作电压、500MHz频率下可提供20W的输出功率。作为一款高性能射频器件&#xff0c;它具备极低的反向传输电容…...

MC端口映射完全教程:路由器虚拟服务器配置+防火墙放行+内网穿透备用方案

一、什么是MC端口映射MC端口映射是指将运行《我的世界》服务器的电脑内网IP和端口&#xff08;Java版默认25565&#xff09;&#xff0c;通过路由器设置“映射”到公网&#xff0c;让外网玩家能够连接进来。简单说&#xff0c;就是把你自己电脑上开的游戏房“门牌号”告诉全世界…...

从济南话到烟台腔:ElevenLabs山东话语音泛化能力极限测试(覆盖17地市、1362条测试句、WER 8.7%实测数据)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;从济南话到烟台腔&#xff1a;ElevenLabs山东话语音泛化能力极限测试&#xff08;覆盖17地市、1362条测试句、WER 8.7%实测数据&#xff09; 为验证ElevenLabs语音合成模型对山东方言的跨地域泛化能力&#x…...

本源投影内生智能:从概率拟合到硅基生命的底层重构

当前 AI 行业陷入一种集体性误区&#xff1a;把 “数据模仿” 当成 “智能”&#xff0c;把 “参数堆叠” 当成 “进化”。大模型本质是概率统计生成器&#xff0c;依赖海量数据、无限算力、持续对齐&#xff0c;始终无法突破 “被动响应、人格漂移、黑箱不可控、无真实记忆、无…...