【Spring】认识 Spring AOP
认识 Spring AOP
- 1.什么是 AOP
- 2.AOP 中的概念
- 3.用 AOP 方式管理日志
- 3.1 编写 AOP 日志注解类
- 3.2 编写控制器用于测试
1.什么是 AOP
AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心、非核心两部分。
- 核心业务功能:用户登录、增加数据、删除数据。
- 非核心业务功能:性能统计、日志、事务管理。
在 Spring 的面向切面编程(AOP)思想里,非核心业务功能 被定义为 切面。核心业务功能和切面功能先被分别进行独立开发,然后把切面功能和核心业务功能 编织 在一起,这就是 AOP。

由此可见,AOP 将业务无关,却为业务模块所共同调用的逻辑封装起来,以便减少系统的重复代码,降低模块间的耦合度,利于未来的拓展和维护。这正是 AOP 的目的,它是 Spring 最为重要的功能之一,被广泛使用。
2.AOP 中的概念
- 切入点(
pointcut):在哪些类、哪些方法上切入。 - 通知(
advice):在方法前、方法后、方法前后做什么。 - 切面(
aspect):切面 = 切入点 + 通知。即在什么时机、什么地方、做什么。 - 织入(
weaving):把切面加入对象,并创建出代理对象的过程。 - 环绕通知:AOP 中最强大、灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法。
3.用 AOP 方式管理日志
下面通过实例演示如何用 AOP 方式管理日志。
3.1 编写 AOP 日志注解类
package com.example.demo.aop;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;/*** Description: 使之成为切面类*/
@Aspect
/*** Description: 把切面类加入到IOC容器中*/
@Component
public class AopLog {private Logger logger = LoggerFactory.getLogger(this.getClass());//线程局部的变量,解决多线程中相同变量的访问冲突问题。ThreadLocal<Long> startTime = new ThreadLocal<>();//定义切点@Pointcut("execution(public * com.example..*.*(..))")public void aopWebLog() {}@Before("aopWebLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {startTime.set(System.currentTimeMillis());// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP方法 : " + request.getMethod());logger.info("IP地址 : " + request.getRemoteAddr());logger.info("类的方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());//logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));logger.info("参数 : " + request.getQueryString());}@AfterReturning(pointcut = "aopWebLog()",returning = "retObject")public void doAfterReturning(Object retObject) throws Throwable {// 处理完请求,返回内容logger.info("应答值 : " + retObject);logger.info("费时: " + (System.currentTimeMillis() - startTime.get()));}//抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。@AfterThrowing(pointcut = "aopWebLog()", throwing = "ex")public void addAfterThrowingLogger(JoinPoint joinPoint, Exception ex) {logger.error("执行 " + " 异常", ex);}}
- @Before:在切入点开始处切入内容。
- @After:在切入点结尾处切入内容。
- @AfterReturning:在切入点
return内容之后切入内容(可以用来对处理返回值做一些加工处理)。 - @Around:在切入点前后切入内容,并自己控制何时执行切入点自身的内容。
- @AfterThrowing:用来处理当切入内容部分抛出异常之后的处理逻辑。
- @Aspect:标记为切面类。
- @Component:把切面类加入到 IOC 容器中,让 Spring 进行管理。
3.2 编写控制器用于测试
下面的控制器构造了一个普通的 Rest 风格的页面。
package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AopLogController {@GetMapping("/aoptest")public String aVoid(){return "hello aop test";}
}
启动项目,访问 http://localhost:8080/aoptest。

在控制台会输出如下信息。

相关文章:
【Spring】认识 Spring AOP
认识 Spring AOP 1.什么是 AOP2.AOP 中的概念3.用 AOP 方式管理日志3.1 编写 AOP 日志注解类3.2 编写控制器用于测试 1.什么是 AOP AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心、非核心两部分。 核心业务功能:…...
什么是访问控制漏洞
什么是AC Bugs? 实验室 Vertical privilege escalation 仅通过隐藏目录/判断参数来权限控制是不安全的(爆破url/爬虫/robots.txt/Fuzz/jsfinder) Unprotected functionality 访问robots.txt 得到隐藏目录,访问目录 ,…...
python基于百度,哈工大等停用表进行的中文分词
import os import pandas as pd import jieba# 加载停用词 def load_stopwords(filenames):stopwords set()for filename in filenames:with open(filename, r, encodingutf-8) as f:for line in f:stopwords.add(line.strip())return stopwords# 中文分词并去除停用词 def se…...
【学习笔记】计算机组成原理(七)
指令系统 文章目录 指令系统7.1 机器指令7.1.1 指令的一般格式7.1.2 指令字长 7.2 操作数类型和操作类型7.2.1 操作数类型7.2.2 数据在存储器中的存放方式7.2.3 操作类型 7.3 寻址方式7.3.1 指令寻址7.3.1.1 顺序寻址7.3.1.2 跳跃寻址 7.3.2 数据寻址7.3.2.1 立即寻址7.3.2.2 直…...
pillow学习4
ImageChops 模块 在 Pillow 库的内置模块 ImageChops 中包含了多个用于实现图片合成的函数。这些合成 功能是通过计算通道中像素值的方式来实现的。其主要用于制作特效、合成图片等操作。 常用的内置函数如下所示: (1)相加函数 add()…...
外企如何有效面对日益严格的跨境数据传输法律?
在当今这个数据驱动的时代,随着全球化步伐的加快,企业跨国界的数据交流已成为常态。但随之而来的,是各国政府对跨境数据传输日益严格的规定和监管,这让众多外资企业(简称“外企”)在享受全球市场红利的同时…...
运维开发.MySQL.范式与反范式化
运维开发 MySQL.三大范式 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/artic…...
HCIA-HarmonyOS Application Developer 课程大纲
一:鸿蒙 Mac 版、 Windows 版【编辑器】和【模拟器】 & 鸿蒙基础环境搭建 - ( 3 课时) - Mac arm 版开发环境搭建:Mac arm 版模拟器安装及配置;安装 DevEcoStudioPreview 版本; - Windows 版开发…...
如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?
在Java中使用Spring Cloud Alibaba Sentinel实现熔断功能的步骤如下: 添加依赖 在项目的pom.xml文件中添加Spring Cloud Alibaba Sentinel的依赖: <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud…...
Day27
Day27 反射案例 案例一:万能数组扩容 注意:copyOf、toString public class Test01 {/*** 知识点:反射案例 之 万能数组扩容* * 注意:copyOf、toString*/public static void main(String[] args) {String[] ss {"aaa"…...
uni-app App端实现文字语音播报(Ba-TTS)
前言 最近在遇到消息提示语音播放出来,查了一圈文档发现并没有自带api 后面想起支付宝收钱播报,不受限与系统环境和版本环境(后面查阅他是音频实现的) 如果是由安卓端需要语音播放功能-直接使用Ba-TTs救急(需要付费2…...
在WHM中如何调整max_upload_size 参数大小
今日我们在搭建新网站时需要调整一下PHP参数max_upload_size 的大小,我们公司使用的Hostease的美国独立服务器产品默认5个IP地址,也购买了cPanel面板,因此联系Hostease的技术支持,寻求帮助了解到如何在WHM中调整PHP参数࿰…...
docker system prune命令详解
docker system prune 是 Docker 中的一个命令,用于清理 Docker 系统中的未使用资源,以帮助回收磁盘空间。这个命令执行一系列操作来删除不再需要的项目,具体包括: 删除所有已停止的容器。删除所有未被任何容器引用的网络…...
使用jdk自带jhat工具排查OOM问题
使用jdk自带jhat工具排查OOM问题 OOM java.lang.OutOfMemoryError: Java heap space排查步骤 编写一个测试类 public class TestJVM {Testpublic void test1() throws InstantiationException, IllegalAccessException {List<A> list new ArrayList<>();for (i…...
独孤思维:付费就是割韭菜,千万别上当
01 很多人觉得付费是坑,是割韭菜。 其实大多数情况,你所付费的,是购买了别人的经验。 让你能够少走很多弯路,让你能够节约大量时间和精力,购买别人的成功路径。 打一个粗俗的比方。 很多人都说,买的资料&am…...
【PB案例学习笔记】-12秒表实现
写在前面 这是PB案例学习笔记系列文章的第11篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…...
Linux驱动开发笔记(二) 基于字符设备驱动的GPIO操作
文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…...
【ESP32之旅】ESP32 PlatformIO 固件单独烧录
背景 有时候使用PIO编写的代码需要发给客户去验证,相比较于发送源码直接发送bin文件,更加的安全而且高效。不用担心源码的泄漏,也不用帮客户配置PIO环境。 操作方法 1.编译 首先进行代码编译,如编译成功会在 .pio\build\airm2…...
视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案
为了实现“以信息化推动应急管理能力现代化”的目标,应急管理部提出了加速现代信息技术与应急管理业务深度融合的计划。这一计划是国家加强和改进应急管理工作的关键举措,也是满足日益严峻的应急管理形势和人民群众不断增长的公共安全需求的紧迫需求。 为…...
【Linux 网络编程】协议的分层知识!
文章目录 1. 计算机网络背景2. 认识 "协议"3. 协议分层 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; 🍎局域网(LAN----Local Area Network): 计算机数量更多了, 通过交换机和路由器连接。 🍎 广…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
