如何实现Spring AOP以及Spring AOP的实现原理

news2024/10/6 17:01:48

AOP:面向切面编程,它和OOP(面向对象编程)类似。

AOP组成:

1、切面:定义AOP是针对那个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各种是一个切面。切面是有切点加通知组成的。

2、连接点:所有可能触发AOP(拦截方法的点)就称之为连接点。

3、切点:定义AOP拦截的规则的。

4、通知:规定AOP执行的时机和执行的方法。(前置通知、后置通知、抛出异常之后通知、返回数据之后通知、环绕通知)

Spring AOP的实现步骤:

1.先项目中添加Spring AOP框架支持

2.定义切面

3.定义切点

4.实现通知

步骤1:引入框架支持

步骤2:定义切面

步骤3.定义切点,设置拦截规则(这里Aspect语法下面会介绍)

步骤4.实现通知方法(在什么时机执行什么方法)(这里只列了一种通知方法,下面几种通知都回介绍)

接着上面所说的,这里介绍一下Aspect J的语法:

Aspect J的语法

示例:

execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>) (修饰符和异常可以省略)

修饰符一般省略:

Public 公共方法

* 任意

返回值不能省略:

Void 没有返回值

String 返回值为字符串

* 任意

包:

com.gyf.crm 固定包

com.gyf.crm.*.service crm包下面子包任意

com.gyf.crm.. crm包下面的所有子包(含自己)

com.gyf.crm.*.service.. crm包下面任意子包,固定目录service,service目录任意包

类:

UserServiceDemo 指定类

*Demo 以Demo结尾的类

User* 以User开头的类

* 任意

方法名:

addUser 固定方法

add* 以add开头的方法

*Do 以Do结尾的方法

* 任意

参数:

() 无参

(int) 一个整型

(int,int) 两个参数

(..) 任意参数

示例

execution(* com.cad.demo.User.*(..)) :匹配 User 类⾥的所有⽅法。

execution(* com.cad.demo.User+.*(..)) :匹配该类的⼦类包括该类的所有⽅法。

execution(* com.cad.*.*(..)) :匹配 com.cad 包下的所有类的所有⽅法。

execution(* com.cad..*.*(..)) :匹配 com.cad 包下、⼦孙包下所有类的所有⽅法。

execution(* addUser(String, int)) :匹配 addUser ⽅法,且第⼀个参数类型是 String,第⼆个

参数类型是 int。

Aspect J语法总结:

关于Aspect语法中的通配符:

1、* 表示匹配任意的内容,用在返回值,包名、类名、方法名都可以使用。

2、.. 匹配任意字符,可以使用在方法参数上,如果用在类上需要配合*一起使用。

3、+ 表示匹配指定类及其它底下的所有子类,比如 com.Car+表示匹配 Car及其所有的子类。

如何定义相关通知:

通知定义的是被拦截的⽅法具体要执⾏的业务,⽐如⽤户登录权限验证⽅法就是具体要执⾏的业务。Spring AOP 中,可以在⽅法上使⽤以下注解,会设置⽅法为通知⽅法,在满⾜条件后会通知本⽅法进⾏调⽤:

前置通知使⽤@Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。

后置通知使⽤@After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。

返回之后通知使⽤@AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。

抛异常后通知使⽤@AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。

环绕通知使⽤@Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执⾏⾃定义的⾏为。

具体实现如下:

在没有异常抛出的情况下,我们可以看看他们各自执行的顺序:

在我们手动设置异常后,再看他们的执行顺序:

可以看到,即使有异常抛出了,执行了AfterThrowing方法,但是还是会继续执行完毕。

我们也可以使用环绕通知实现统计每个方法的执行时间,具体实现如下:

注意:我们可以根据joinPoint.getSignature().getDeclaringTypeName()+"."+ joinPoint.getSignature().getName() 得到类的类型和名称,在前面我们new了stopWatch对象,调用了start和stop方法,后面我们在调用stopWatch.getTotalTimeMillis()就可以得到耗费时间了。

Spring AOP的实现原理

Spring AOP ⽀持 JDK Proxy 和 CGLIB ⽅式实现动态代理。默认情况下,实现了接⼝的类,使⽤ AOP 会基于 JDK ⽣成代理类,没有实现接⼝的类,会基于 CGLIB ⽣成代理类。

Spring AOP动态代理实现:

在 class 代码运⾏期,动态的织⼊字节码。主要基于两种方式:

1、JDK Proxy (JDK动态代理)

2、CGLIB Proxy :默认情况下Spring AOP都会采用CGLIB来实现动态代理。

CGLIB来实现动态代理的原理:通过继承代理对象来实现动态代理的(子类拥有父类的所有功能)。缺点:不能代理最终类(也就是被final修饰的类)。

总结:

AOP 是对某⽅⾯能⼒的统⼀实现,它是⼀种实现思想,Spring AOP 是对 AOP 的具体实现,Spring AOP 可通过 @Aspect(注解)的⽅式来实现 AOP 的功能。Spring AOP 是通过动态代理的⽅式,在运⾏期将 AOP 代码织⼊到程序中的,它的实现⽅式有两种: JDK Proxy 和 CGLIB。

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

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

相关文章

ClickHouse快速入门

目录 1 ClickHouse介绍1.1 ClickHouse 的特点1.1.1 列式存储1.1.2 DBMS 的功能1.1.3 多样化引擎1.1.4 高吞吐写入能力1.1.5 数据分区与线程级并行1.1.6 性能对比 2 数据类型2.1 整型2.2 浮点型2.3 布尔型2.4 Decimal 型2.5 字符串2.6 枚举类型2.7 时间类型2.8 数组 3 表引擎3.1…

SpringBoot tomcat核心参数

server.tomcat.threads.min-spare10server.tomcat.threads.max200server.tomcat.max-connections8192server.tomcat.accept-count100 第一个参数代表程序启动就会开启10个线程。 如果我改成20个&#xff0c;看看什么情况&#xff0c;可以看到初始化了20个线程 看第二个参数&am…

2022年中国云市场份额:阿里云腾讯云下降

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 4月23日&#xff0c;IDC发布《中国公有云服务市场(2022下半年)跟踪》&#xff0c;占据前四的分别为阿里云(40.6%)、华为云(11.0%)、腾讯云(11.0%)、中国电信(8.7%)。咱们说重点&#xff0c;如下图所…

DFMEA 在车用燃料电池空压机设计中的应用

摘要&#xff1a; DFMEA在空压机研发中的应用 氢气具有资源丰富、热值高和无污染等特点&#xff0c;因而是燃料电池汽车最理想的二次能源。空压机作为燃料电池汽车的关键总成&#xff0c;掌握其核心部件的设计和制造技术非常必要。应用传统的设计方法进行相关零部件如空气轴承…

D3.js(2) Data-Join

什么是Data-Join&#xff1f; 本质上是将数据与图元绑定 可以省去大量根据数据设置图元属性的代码量&#xff0c;对动态变化的数据提供统一接口 D3.js绑定数据的三个状态 Enter 数据数量>图元数量&#xff0c;d3.js会根据新增的数据生成相应的图元 给不存在数据绑定的图…

跨境电商服务简单说明

​ 前言 跨境电商服务是指通过互联网平台进行国际贸易的一种新型商业模式&#xff0c;涉及跨境物流、跨境支付、跨境电商平台等多个领域。随着全球化的不断推进和消费者需求的不断变化&#xff0c;跨境电商服务行业呈现出快速发展的趋势。 发展背景 跨境电商服务行业的发展背景…

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

JavaScript 函数调用和JavaScript 闭包

文章目录 一、JavaScript 函数调用二、JavaScript 闭包总结 一、JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同在于 this 的初始化。 this 关键字 一般而言&#xff0c;在Javascript中&#xff0c;this指向函数执行时的当前对象。 注意 this 是保留…

美创科技首届渠道高峰论坛| 两大分论坛亮点汇聚

4月22日&#xff0c;美创科技首届渠道高峰论坛在海南三亚隆重举行&#xff0c;本届高峰论坛以“新起点 新战略 共赢数安蓝海”为主题&#xff0c;全国各地200余家合作伙伴齐聚。当日下午&#xff0c;行业分论坛、技术分论坛两大论坛以及圆桌会议&#xff0c;多方视角、全方位共…

C++篇----auto、内联函数、函数重载

文章目录 一、auto二、内联函数&#xff08;inline)三、函数重载 一、auto auto在c中是会根据等号右边表达式自动推导等号左边的类型 #include<iostream> using namespace std;int main() {int a 0;auto b a;double c 1.1;auto d c;//打印类型typeid().name()cout &l…

OpenGL与Metal API的Point Sprite

我们在实际用OpenGL等3D图形渲染API时 点图元 往往用得不多&#xff0c;而在粒子系统中可能也是用一个正方形来绘制一单个粒子。不过在当前大部分3D图形渲染API中都能支持用点图元来绘制一个具有纹理贴图的粒子&#xff0c;从早在OpenGL 1.4开始就能支持了&#xff0c;而在Open…

机器学习:基于逻辑回归(Logistic Regression)对股票客户流失预测分析

基于逻辑回归对股票客户流失预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1…

npm install报错

出现这个错误&#xff0c;我百度之后得到的解决方案是&#xff1a; 在node.js安装目录下找到node_modules文件夹并删除 但是当我操作完成之后&#xff0c;却出现了另外一个ERROR&#xff1a; 于是我又还原了原来的node_modules文件夹&#xff0c;于是又报一开始的错 仔细瞅瞅…

Netty 单机百万连接测试

1.Netty框架简介 1.1.Netty简介 netty是jboss提供的一个java开源框架&#xff0c;netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可用性的网络服务器和客户端程序。也就是说netty是一个基于nio的编程框架&#xff0c;使用netty可以快…

NFC 学习笔记 5 MFRC522读写器2 NDEF

NDEF简介 NDEF&#xff08;NFC Data Exchange Format&#xff09;是一种标准化的数据格式&#xff0c;用于将数据存储在NFC标签或智能手机中。该格式是NFC论坛定义的&#xff0c;目的是在不同的NFC设备之间交换信息。 NDEF格式可以存储各种类型的数据&#xff0c;例如URL、文本…

面对市场内卷,不同品牌应该如何做客户增长?

后疫情时代&#xff0c;我国新生人口减少、人口老龄化加剧&#xff0c;chatgpt火爆和AI替代论盛行&#xff0c;市场上&#xff0c;口红效应依旧繁荣&#xff0c;消费者的延迟满足、替代性满足成为常见心理&#xff0c;面对宏观的不确定性&#xff0c;人们在消费上更需要确定性的…

github 基础

github 基础 前面讲了 git 的基本使用&#xff0c;这里简单的提一下 github 的基本使用&#xff0c;主要还是 pull 和 push 两个部分。其中 pull 好像有了一些变化&#xff0c;现在似乎是需要 rebase 而不是自动就帮你做了……&#xff1f;不过 rebase 的部分之后再提。 当然…

Vuex实现数据共享

目录 一&#xff1a;index.js的创建 二&#xff1a;index.js的引入 三&#xff1a;Count.vue 四&#xff1a;App.vue的使用 五&#xff1a;mapstate等的使用 五&#xff1a;多组件数据共享&#xff08;模块化编程&#xff09; vc通过dispatch联系actions&#xff0c;acti…

Python小姿势 - ###### 随机选取的知识点:Python日期时间处理

随机选取的知识点&#xff1a;Python日期时间处理 Python日期时间处理&#xff1a;一种更简单的方式 日期和时间处理是许多程序中必不可少的部分。Python提供了一个标准库来处理日期和时间&#xff0c;这个库叫做datetime&#xff0c;它提供了一些类来处理不同的日期和时间格式…

远程访问及控制(SSH)

远程访问及控制&#xff08;SSH&#xff09; 一、SSH远程管理二、SSH服务1、ssh远程登录方式2、scp远程复制3、sftp安全FTP4、sshd配置文件5、ssh密钥对配置5.1 ssh密钥对免交互登录 三、TCP wrappers 访问控制1、**TCP wrappers &#xff08;TCP封套&#xff09;**2、**TCP wr…