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

【JavaEE进阶】 Spring AOP快速上手

文章目录

  • 🍃什么是AOP
  • 🌳什么是Spring AOP
  • 🌴上手Spring AOP
    • 🚩引入依赖
    • 🚩编写AOP程序
  • ⭕总结

🍃什么是AOP

AOP是Aspect Oriented Programming的简称(又称为面向切⾯编程)

什么是面向切面编程呢?

  • 切面就是指某⼀类特定问题,所以AOP也可以理解为面向特定方法编程.

什么是面向特定方法编程呢?

  • 比如博主在前面实现的的"登录校验",就是⼀类特定问题.登录校验拦截器,就是对"登录校验"这类问题的统⼀处理.所以,拦截器也是AOP的⼀种应用.

  • AOP是⼀种思想,拦截器是AOP思想的⼀种实现.Spring框架实现了这种思想,提供了拦截器技术的相关接⼝.

  • 同样的,统⼀数据返回格式和统⼀异常处理,也是AOP思想的⼀种实现.

简单来说:AOP是⼀种思想,是对某⼀类事情的集中处理

🌳什么是Spring AOP

AOP是⼀种思想,它的实现⽅法有很多,有Spring AOP,也有AspectJ、CGLIB等.

Spring AOP是其中的⼀种实现⽅式.

在博主实现图书馆管理实现了统⼀功能,那么是不是就学会了Spring AOP呢?答案当然不是.

拦截器作用的维度是URL(⼀次请求和响应),@ControllerAdvice 应用场景主要是全局异常处理(配合自定义异常效果更佳),数据绑定,数据预处理.

AOP作用的维度更加细致(可以根据包、类、方法名、参数等进⾏拦截),能够实现更加复杂的业务逻辑.

举个例⼦:

我们现在有⼀个项⽬,项目中开发了很多的业务功能
在这里插入图片描述

现在有⼀些业务的执行效率⽐较低,耗时较⻓,我们需要对接⼝进⾏优化.

第⼀步就需要定位出执行耗时⽐较长的业务方法,再针对该业务方法来进⾏优化

如何定位呢?

  • 我们就需要统计当前项⽬中每⼀个业务⽅法的执⾏耗时.

如何统计呢?

  • 可以在业务⽅法运⾏前和运⾏后,记录下⽅法的开始时间和结束时间,两者之差就是这个⽅法的耗时.

就如下图所示:
在这里插入图片描述

这种⽅法是可以解决问题的,但⼀个项目中会包含很多业务模块,每个业务模块⼜有很多接⼝,⼀个接⼝⼜包含很多⽅法,如果我们要在每个业务⽅法中都记录⽅法的耗时,对于程序员而言,会增加很多的⼯作量.

AOP就可以做到在不改动这些原始⽅法的基础上,针对特定的方法进行功能的增强.

AOP的作用:在程序运⾏期间在不修改源代码的基础上对已有⽅法进⾏增强,达到⽆侵⼊性,实现解耦

我们先来看一下Spring AOP是如何实现的吧、

🌴上手Spring AOP

我们使用Spring AOP来实现一下统计时间

🚩引入依赖

在pom.xml⽂件中添加配置

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

🚩编写AOP程序

首先我们准备需要实现统计的程序如下
在这里插入图片描述
编写AOP相关程序如下:

@Slf4j
@Aspect
@Component
public class TimeAspect {/*** 记录⽅法耗时*/@Around("execution(* com.example.demo.controller.*.*(..))")public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录⽅法执⾏开始时间long begin = System.currentTimeMillis();//执⾏原始⽅法Object result = pjp.proceed();//记录⽅法执⾏结束时间long end = System.currentTimeMillis();//记录⽅法执⾏耗时log.info(pjp.getSignature() + "执⾏耗时: {}ms", end - begin);return result;}
}

由于这里只是简单上手AOP,所以这里不做过多讲解。只是进行简单解释

代码解释如下:

  1. @Aspect:标识这是⼀个切⾯类

  2. @Around:环绕通知,在⽬标⽅法的前后都会被执⾏.后⾯的表达式表⽰对哪些方法进行增强.

  3. ProceedingJoinPoint.proceed()让原始方法执行,并返回一个值

  4. 该方法最后需要返回一个值,也就是执行原始方法所接受的值

整个代码划分为三部分
在这里插入图片描述

接下来我们运行程序来观察一下效果

运行程序,观察日志如下:
在这里插入图片描述

我们通过AOP⼊门程序完成了业务接执行耗时的统计.

通过上面的程序,我们也可以感受到AOP面向切⾯编程的⼀些优势:

  • 代码⽆侵⼊:不修改原始的业务方法,就可以对原始的业务方法进行了功能的增强或者是功能的改变

  • 减少了重复代码

  • 提高开发效率

  • 维护方便

⭕总结

关于《【JavaEE进阶】 Spring AOP快速上手》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章:

【JavaEE进阶】 Spring AOP快速上手

文章目录 &#x1f343;什么是AOP&#x1f333;什么是Spring AOP&#x1f334;上手Spring AOP&#x1f6a9;引入依赖&#x1f6a9;编写AOP程序 ⭕总结 &#x1f343;什么是AOP AOP是Aspect Oriented Programming的简称&#xff08;又称为面向切⾯编程&#xff09; 什么是面向…...

android应用开发基础知识,安卓面试2020

第一章&#xff1a;设计思想与代码质量优化 1、设计思想六大原则 2、三大设计模式 3、数据结构 4、算法 第二章&#xff1a;程序性能优化 1、启动速度和执行效率优化 2、布局检测与优化 3、内存优化 4、耗电优化 5、网络传输与数据存储优化 6、APK大小优化 7、屏幕适配 8、…...

unity-unity2d基础操作笔记(一)0.5.0

unity2d基础操作笔记 一、如何查看当前系统的输入设置二、如何获取水平或者垂直的输入的代码三、如何获取当前人物的x和y的值三、如何简单写出控制人物水平移动的代码四、如何设定游戏的帧率五、如何控制渲染顺序六、如何调整摄像机摄像范围大小七、如何对Hierachy中的图进行分…...

东芝工控机维修东芝电脑PC机维修FA3100A

TOSHIBA东芝工控机维修电脑控制器PC机FA3100A MODEL8000 UF8A11M 日本东芝TOSHIBA IA controller维修SYU7209A 001 FXMC12/FXMC11;BV86R-T2GKR-DR7YF-8CPPY-4T3QD; CPU处理单元是可编程逻辑控制器的控制部分。它按照可编程逻辑控制器系统程序赋予的功能接收并存储从编程器键入…...

AI新秀Mistral:“Open AI“ 新时代

最近互联网出现不少类似“下一代openai”、“GPT-4最强竞品”、“法国AI独角兽”、“欧洲的OpenAI”、“微软新宠儿”.... 的文章&#xff0c;都会附带一张图片&#xff0c;就是下面这张&#xff1a; 那么到底发生了什么&#xff0c;出来个什么东西呢&#xff1f;就是本文的主…...

Dockerfile制作镜像

Dockerfile制作镜像 Dockerfile介绍 dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 dockerfile仅仅是用来制作镜像的源码文件&#xff0c;是构建容器过程中的指令&#xff0c;docker能够读取dockerfile的指定进行自动…...

如何在宝塔面板中设置FTP文件传输服务并实现远程文件管理

文章目录 1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 宝塔FTP是宝塔面板中的一项功能&#xff0c;用于设置和管理FTP服务。通过宝塔FTP&#xff0c;用户可以创建FTP账号&#xff0c;配置FTP用户权限…...

记录 | 设置容器内外时间一致

1.共享主机的localtime 创建容器的时候指定启动参数&#xff0c;挂载localtime文件到容器内&#xff0c;保证两者所采用的时区是一致的 docker run -ti -d --name my-nginx -v /etc/localtime:/etc/localtime:ro docker.io/nginx /bin/bash 2.复制主机的localtime docker …...

LeetCode 239 滑动窗口最大值

LeetCode 239 滑动窗口最大值 问题描述 给定一个整数数组 nums 和一个整数 k&#xff0c;定义一个大小为 k 的滑动窗口&#xff0c;该窗口从数组的最左侧移动到最右侧。你可以看到在滑动窗口内的 k 个数字&#xff0c;并返回滑动窗口中的最大值。 解题思路 我们可以利用一个…...

Vue单文件组件(SFC)规范

Vue 单文件组件 (SFC) 规范 文件地址&#xff1a;Vue单文件组件规范 简介 .vue 文件是一个自定义的文件类型&#xff0c;用类 HTML 语法描述一个 Vue 组件。每个 .vue 文件包含三种类型的顶级语言块 <template>、<script> 和 <style>&#xff0c;还允许添加…...

简单版 git快速上手使用 clone项目 新建/切换分支 提交修改

Git是一个广泛使用的版本控制系统&#xff0c;允许多个用户跟踪文件的更改&#xff0c;并协作开发项目。 首先确定自己电脑已经安装了git&#xff0c;具体安装步骤请查找教程&#xff0c;应该不难。 以windows电脑为例&#xff0c;安装完后在搜索栏搜索git会出现 先解释一下这…...

本届挑战赛季军方案:基于图网络及LLM AGENT的微服务系统异常检测和根因定位方法

aiboco团队荣获本届挑战赛季军。该团队来自亿阳信通。 方案介绍 本届挑战赛采用开放式赛题&#xff0c;基于建行云龙舟运维平台的稳定性工具和多维监控系统&#xff0c;模拟大型的生活服务APP的生产环境&#xff0c;提供端到端的全链路的日志、指标和调用链数据。参赛队伍在组…...

【MySQL】_内连接

本专栏关于联合查询已建好相应库与表&#xff0c;链接如下&#xff1a; 【MySQL】_联合查询基础表-CSDN博客 基于以上库与表&#xff0c;本篇介绍内连接&#xff1b; 内连接表示语法有两种&#xff1a; 第一种&#xff1a; select [列名],[列名]... form [表1],[表2] where…...

ElasticSearch之跨集群搜索cross cluster search

写在前面 本文看下跨集群搜索相关内容。 1&#xff1a;实战 1.1&#xff1a;创建集群 bin/elasticsearch -E node.namecluster0node -E cluster.namecluster0 -E path.datacluster0_data -E discovery.typesingle-node -E http.port9200 -E transport.port9300 bin/elastic…...

06|Mysql内部组件结构

1. 连接器 客户端要向mysql发起通信都必须先跟Server端建立通信连接&#xff0c;而建立连接的工作就是由连接器完成的 mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306连接步骤: 1、如果用户名或密码不对&#xff0c;你就会收到一个"Access denied for us…...

文件的写出操作

1. 文件不存在&#xff0c;创建文件后写出方法: <1>打开文件&#xff1a;open()方法是文件不存在时创建文件 file open("D:/test.txt","w",encoding"UTF-8")<2>写出文件: file.write("please open your book") #内容写到内…...

使用gitlab搭建npm的依赖库,并在项目中使用

使用gitlab搭建npm的依赖库&#xff0c;并在项目中使用 背景 1&#xff0c; 在多个项目中都有个公共的库包&#xff0c;又不想发布到npm 2&#xff0c; 一些开源的库&#xff0c;修改了一些定制化的东西&#xff0c;又不想推送代码到开源仓库&#xff08;不一定会合并你的代码…...

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…...

如何在Spring Boot应用中进行文件预览?

在Spring Boot应用中实现文件预览功能&#xff0c;具体方法取决于文件的类型和你想如何预览它们。以下是一些常见文件类型的预览方法&#xff1a; 1. **图片预览**&#xff1a; 对于图片文件&#xff0c;你可以直接在HTML页面中通过<img>标签的src属性引用图片的URL来…...

阿里云4核16G服务器多少钱?幻兽帕鲁配置报价

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...