springboot(4)

news2024/11/26 20:22:21

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.coloradmin.cn/o/847792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扩展卡尔曼滤波器代码

文章目录 前言问题状态向量和观测向量加性噪声的形式状态方程及求导观测方程及求导状态初始化过程噪声和观测噪声卡尔曼滤波过程code 前言 卡尔曼滤波器在1960年被卡尔曼发明之后,被广泛应用在动态系统预测。在自动驾驶、机器人、AR领域等应用广泛。卡尔曼滤波器使…

在R中比较两个矩阵是否相等

目录 方法一:使用all.equal()比较两个R对象是否近似相等 方法二:使用identical比较两个R对象是否精确相等。 方法一:使用all.equal()比较两个R对象是否近似相等 使用函数:all.equal(x,y) 比较两个R对象x和y是否近似相等 > M1…

抽象工厂模式(C++)

定义 提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。 使用场景 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种…

Java实现微信公众号自定义回复

第一版实现微信公众号自动回复: ● 实现自定义回复内容的管理,将关键词、半匹配、以及关注、默认回复等刷新到缓存中 ● 用户发送消息进行匹配后通过微信回复格式直接返回,如果内容存在文字和图片,文字通过xml格式直接返回&…

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目: 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 示例1 输入:s "abaccdeff" 输出:b 示例2 输入:s "" 输出: 提示 0 …

RocketMQ学习一入门使用

从0开始学习RocketMQ,这一节主要是windows下环境部署,以及我理解的基本使用流程。 安装 1.下载地址:下载 | RocketMQ 注意,如果是windows环境下需要下载的是二进制文件,也就是这一列。 2.下载后解压到自己想要的目录…

从零开始学习查询京东快递并查询超时状态的小技巧

随着电子商务的蓬勃发展,快递成为了我们日常生活中不可或缺的一部分。而在众多快递公司中,京东快递以其高效、可靠的服务赢得了广大用户的青睐。然而,查询京东快递并同时查询快递的超时状态却一直是用户们头痛的问题。今天,我将为…

学习笔记|LED点亮原理|三极管在数字电路中的应用|Keil中的Tab设置|C51中对准双向口|STC32G单片机视频开发教程(冲哥)|第四集-上:点亮LED

文章目录 1.LED点亮原理STC32G12K128LQFP64QFN64管脚图:Tips:USB-ISP下载程GPIO (general purpose intput output)Tips:三极管在数字电路中的应用 2 新建工程Tips:Tab设置11.2 配置IO口注意: Tips:C51中对准双向口的解…

最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用

由于GaN基Micro-LED表面积-体积比增加,其在热学方面的性质有别于大尺寸的LED,如缺陷复合导致的热效应将在发光区域中产生诸多“热”点,导致发光波长不均匀,这将影响后期显示系统的成像稳定性。针对上述问题,天津赛米卡…

shapely库的用法,高效处理点、线、面的几何关系和相关延申(GeoPandas 库)python

1、shapely库的基本用法 Shapely 是一个用于处理几何对象的 Python 库,它提供了各种函数和方法来进行空间分析和几何计算。下面是一些 Shapely 库的常见用法示例: 1. 创建几何对象: from shapely.geometry import Point, LineString, Poly…

uni——tab切换

案例展示 案例代码 <view class"tablist"><block v-for"(item,index) in tabList" :key"index"><view class"tabItem" :class"current item.id?active:" click"changeTab(item)">{{item.nam…

你真的懂OP吗?知道什么是OP吗?看完你就懂了!

运维到底是干什么的&#xff1f;估计连运维工程师本身都不清楚&#xff0c;小编各种搜索也没找到答案&#xff0c;问了很多运维老员工&#xff0c;终于总结出了运维工程师的工作内容。 01运维的定义本质上是对网络、服务器各个阶段的运营与维护&#xff0c;在成本、稳定性、效率…

混合云环境实现K8S可观测的6大策略

2023年&#xff0c;原生云应用及平台发展迅猛。大量企业都在努力发挥其应用程序的最大潜力&#xff0c;以确保极致的用户体验并推动业务增长。 混合云环境的兴起和容器化技术(如Kubernetes)的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字舞台上&#xff0c;…

赴日IT工作之中日假期大对比!是你想要的程序员生活吗?

说了这么多关于工作方面的事宜&#xff0c;今天咱们来聊聊大家都关心的假期问题吧&#xff01;中国和日本的假期有什么区别呢&#xff1f;从天数上来看&#xff0c;其实中日假期都是16天左右&#xff0c;但是可能在调休方面&#xff0c;日本相比我国对员工层会有一点点优势&…

Linux环境下安装JDK(17)

1、官网下载 https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html 2、传到Linux上去&#xff0c;至于用什么工具&#xff0c;自行选择 3、虚拟机上&#xff0c;找到它&#xff0c;移到你想移的地方去 4、解压缩&#xff0c;换包名 tar -zxvf jdk…

Django快速入门

文章目录 一、安装1.创建虚拟环境&#xff08;virtualenv和virtualenvwrapper&#xff09;2. 安装django 二、改解释器三、创建一个Django项目四、项目目录项目同名文件夹/settings.py 五、测试服务器启动六、数据迁移七、创建应用八、基本视图1. 返回响应 response2. 渲染模板…

企业微信认证费用及年审的问题(收藏)

一、企业微信认证审核服务费用说明 企业微信认证的审核是委托第三方审核公司来履行的&#xff0c;对企业提交资料的真实性进行甄别和校验。针对中、大型规模企业&#xff0c;企业微信团队会以电话回访、征信核查等方式&#xff0c;对企业规模进行严格审核。针对大型规模企业&a…

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令&#xff0c;修改Html内容&#xff0c;添加“Hello World”5. 停止与开始容器6. 删除容器…

错过NFT投资,你可能会后悔吗?

在过去的几年里&#xff0c;非同质化代币&#xff08;NFT&#xff09;以其独特性和创新性&#xff0c;迅速成为数字资产领域的热门话题。NFT代表了数字资产的所有权和独特性&#xff0c;为艺术、音乐、游戏和虚拟世界等领域提供了全新的可能性。然而&#xff0c;对于那些错过了…

使用 Docker 部署 Prometheus + Grafana 监控平台

使用 Docker 部署 Prometheus Grafana 监控平台 默认docker 已经安装好,我使用的是CentOS7 注意一定要开启服务器对应的端口 1. 安装Prometheus docker run -itd --nameprometheus --restartalways -p 9090:9090 prom/prometheus访问:http://ip:9090 2.安装Grafana #这里的$…