【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用
【JavaEE】Spring AOP(1)
文章目录
- 【JavaEE】Spring AOP(1)
- 1. Spring AOP 是什么
- 1.1 AOP 与 Spring AOP
- 1.2 没有AOP的世界是怎样的
- 1.3 AOP是什么
- 2. Spring AOP 框架的学习
- 2.1 AOP的组成
- 2.1.1 Aspect 切面
- 2.1.2 Pointcut 切点
- 2.1.3 Advice 通知
- 2.1.4 Join Point 连接点
- 2.2 Spring AOP的基本使用
- 2.2.1 引入依赖
- 2.2.2 定义一个Aspect
- 2.2.3 定义一个Pointcut
- 2.2.4 Join Point
- 2.2.5 定义Advice
- 2.2.5.1 前置通知,后置通知与返回通知
- 2.2.5.2 异常通知
- 2.2.5.3 环绕通知
- 2.3 Spring AOP的实现原理
- 2.3.1 动态代理
- 2.3.2 Spring AOP动态代理组成
- 2.3.3 JDK Proxy 与 CGLIB的区别
【JavaEE】Spring AOP(1)
1. Spring AOP 是什么
1.1 AOP 与 Spring AOP
AOP (**A**spect **O**riented Programming),是一种思想,即面向切面编程
Spring AOP 则是一个框架,Spring项目中需要引入依赖而使用
- AOP和Spring AOP的关系就相当于IoC和DI
- Spring AOP让开发者能够半自动的开发AOP思想下实现的功能
1.2 没有AOP的世界是怎样的
我们要实现用户登录校验的功能,没有实现AOP之前,我们只能这样做:
博客系统登录功能实现,博客传送门:【JavaEE】前后端综合项目-博客系统(下)_s:103的博客-CSDN博客
- 前端进入每一个页面的时候,专门发送“登录校验”的请求给后端进行登录校验
- 前端发送每一个请求的时候,后端都会自动进行登录校验
无论是哪种,都有这样的特性,就是代码耦合度高,网页的每个功能都要各自实现“登录校验”的代码,这样的坏处是:
- 不符合专一设计原则,开发者开发一个功能就应该全心全意,有针对性,这样开发效率也会高点儿~
- 耦合度很高,一改则需万改
图示:
1.3 AOP是什么
刚才说了,AOP是面向切面编程,这是英语直译的结果,不用太多理会~
- 可以理解为,它是 对某一类事情的集中处理
有了AOP后,我们只需要在代码的某一处配置一下,所有的功能就能实现用户登录校验了,不再需要重复写那些代码了~
- 也对“登录校验”这个步骤,集中处理了,这个代码开发过程就是面向切面编程
切面可以理解为,切下来的一个方面,一个步骤
切下来后有种藕断丝连的感觉:
例如这个图,再等一下讲解AOP的组成之后,回头看可能会有更好的理解~
- AOP后,功能表现还是左上,但是代码长成右下
- “登录校验”被切了下来一样
如果把切面看成动作执行者,✂
- 我们可以将切面形象地比喻为一把剪刀。
- 剪刀可以在不改变原始材料的情况下,将其切割成不同的形状
- 同样,切面在编程中也可以在不修改原始代码的情况下,将横切关注点应用到不同的对象或方法上
- 在代码实现的时候,将需要的统一处理的功能,“剪”下来进行统一处理
- 就像剪刀可以将材料切割成不同的形状一样,切面可以将横切关注点切割并应用到代码的不同部分,从而实现代码的模块化和重用
例如,调用功能1的时候,会通过切下来的“面”的匹配对应的“块”,之后进行“组装”~
- 这样就在调用功能1之前进行了登录校验
好处:
- 满足单一设计原则,登录校验的存在,不会改变各个功能的原代码
- 耦合度低,改一处等于改一万处
AOP就很适合解决这种功能统一,且是使用的地方较多的功能了
- AOP的统一处理!
除了登录校验外,还可以实现:
- 统一
- 日志记录
- 方法执行时间统计
- 返回格式设置
- 异常处理
- 事务开启与提交
- 等等…
也可以说,AOP面向了多个对象
也就是说,AOP是OOP(Object Oriented Programming,面向对象编程)的一个补充和完善
2. Spring AOP 框架的学习
Spring AOP框架内部实现了AOP,开发者按照规则写下的代码,就对应着AOP逻辑
Spring AOP的学习分为以下三步:
- AOP的组成
- Spring AOP的基本使用
- Spring AOP的实现原理
2.1 AOP的组成
2.1.1 Aspect 切面
一个Aspect代表一个“统一处理”,因为统一设计原则,一个切面就是一个功能,例如“登录校验”
- 包含切点、通知,即有横切逻辑的定义,也有连接点的定义
如果把这些定义,看成“切面”的独一无二的横切面,看成标识,切面就对应那个“块”,也就是功能,所以切面就看成一个功能~
即,AOP是干啥的
2.1.2 Pointcut 切点
规定 这个切面是从哪些,前后端交互接口,“剪”下来的
- 例如:定义用户登录拦截规则,哪些接口才需要判断用户登录权限
2.1.3 Advice 通知
AOP执行的具体方法
- 例如:获取用户信息,如果后端有记录对应的登录信息,就说明已经登录,否则没有登录
2.1.4 Join Point 连接点
有可能触发切点的所有点
- 满足切点规则的所有前后端交互接口
2.2 Spring AOP的基本使用
通过代码实现,你可能会有更切合的体验!
- 我只讲一种方式,其他感兴趣的可以去学,有需要的去学
2.2.1 引入依赖
你会发现,在IDEA的勾选选入依赖里,没有AOP这个选项,这也很正常,因为并不是所有依赖都包含在其中!
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 第一次加载会有点慢,注意网络通畅~
2.2.2 定义一个Aspect
一个切面其实就是一个类,加上@Aspect注解,这个类就是为了实现某个“统一处理”的
- 需要加五大类注解,这个算是个组键吧,所以用@Component
2.2.3 定义一个Pointcut
一个方法加上注解@Pointcut,在括号内写一些语句,就定义了一个切点
- 这个方法可以不返回一切,方法名自定义,没有参数列表,没有代码体…,如果加了会怎么样感兴趣可以去了解,但是暂时用不到~
- 括号内部的语句是有对应的语法的,这里了解这句话的含义,举一反三就好,语法是啥感兴趣可以去了解
execution(* com.example.demo.controller.TestController.*(..))
,解析:
execution()
,执行括号中提及的方法,就触发切点*
,不限制方法权限(public、private…),全部方法com.example.demo.controller.TestController.
,针对的类的位置*(..)
,代表类中的所有方法
*
,所有的方法名(..)
,任意的参数列表
2.2.4 Join Point
对于连接点,则是刚才切点对应的前后端交互接口:
- /test/say_hi
- /test/say_hello
我们在这里不需要在意其他业务,只需要专注开发,而Aspect的代码开发里则面向了这几个连接点!
为了与通知的方法区分,我在控制台打印信息:
2.2.5 定义Advice
通知就是访问对应接口的时候,要执行的业务,分为五种通知:
- 前置通知
- 后置通知
- 环绕通知
- 返回通知
- 异常通知
顾名思义,区分就是,通知执行的时机~
对应五种注解(加在一个方法的上面,此方法被称为通知方法):
- @Before,通知方法在目标方法执行之前执行
- @After,通知方法在目标方法执行之后执行
- @Around,通知包裹了目标方法,自定义行为
- @AfterReturning,通知方法在目标方法返回后调用
- @AfterThrowing,通知方法在目标抛出异常后调用
2.2.5.1 前置通知,后置通知与返回通知
// 前置通知
@Before("pointcut()")
public void doBefore(){System.out.println("执⾏ Before ⽅法");
}
// 后置通知
@After("pointcut()")
public void doAfter(){System.out.println("执⾏ After ⽅法");
}
// return 之前通知
@AfterReturning("pointcut()")
public void doAfterReturning(){System.out.println("执⾏ AfterReturning ⽅法");
}
注解括号内代表,对应的切点方法
效果:
按多次:
2.2.5.2 异常通知
// 抛出异常之前通知
@AfterThrowing("pointcut()")
public void doAfterThrowing(){System.out.println("执⾏ doAfterThrowing ⽅法");
}
对于异常通知的触发案例,项目开发很少用,暂时不介绍
2.2.5.3 环绕通知
自定义行为的通知,可以模拟其他通知~
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {Object object = null;System.out.println("Around方法开始执行");object = joinPoint.proceed();System.out.println("Around方法结束执行");return object;
}
ProceedingJoinPoint这个类的对象joinPoint,代表着连接点对象
- 调用proceed()方法代表进行这个连接点对于的方法
- try catch后能模拟异常通知
记得返回这个object,不然框架处理不了返回值作为响应!
- 默认执行后的返回值是交给框架的,而这里是交给object~
效果:
这样也看出了优先级~
环绕通知,更灵活
-
更好的实现“原子性”,通过加锁就行,如执行时间统计…
-
如后置通知方法需要跟前置通知方法有“数据交互”
2.3 Spring AOP的实现原理
Spring AOP 是构建在**动态代理的基础上,因此Spring 对 AOP的支持局限于方法级的拦截**
2.3.1 动态代理
原本访问目标对象:
AOP之后:
就像fiddler一样,代理了请求,期间保留了其信息…
通过代理类,目标对象Join Point何时执行目标方法,代理说了算
- 在环绕通知的时候体现尤为显著
- 代理类 根据 Aspect 进行对应的行为
我们不通过Spring AOP框架,我们只能自己实现AOP才能实现在目标方法调用之前和调用之后…时机进行一些业务!
2.3.2 Spring AOP动态代理组成
- JDK Proxy
- 代理类必须实现某个接口,才能使用JDK Proxy
- 底层有用到反射…
- CGLIB
- 通过实现代理类的子类来实现动态代理,只能代理能被继承的类
通过这两种动态代理的实现~
- 单独一种有局限性
2.3.3 JDK Proxy 与 CGLIB的区别
- 出身不同
- JDK Proxy 来自java
- CGLIB 来自第三方
- 实现不同
- JDK Proxy,通过代理类必须实现某个接口
- CGLIB,通过实现代理类的子类
- 性能不同
- jdk 7/7+,JDK Proxy性能略高于CBLIB
- jdk7-,CBLIB性能远高于JDK Proxy
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!不得不提的是,切面、切点、连接点、通知,这些名词,不要纠结他们为啥这么叫,咱们知道他们的含义,知道Spring AOP怎么开发就行了~
代码:spring_aop-demo · 游离态/马拉圈2023年8月 - 码云 - 开源中国 (gitee.com)
相关文章:
【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用
【JavaEE】Spring AOP(1) 文章目录 【JavaEE】Spring AOP(1)1. Spring AOP 是什么1.1 AOP 与 Spring AOP1.2 没有AOP的世界是怎样的1.3 AOP是什么 2. Spring AOP 框架的学习2.1 AOP的组成2.1.1 Aspect 切面2.1.2 Pointcut 切点2.1…...
SpringBoot+微信小程序奶茶在线点单小程序系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBoot微信小程序框架开发的奶茶在线点单小程序系统。首先,这是一个前后端分离的项目ÿ…...
【支付宝小程序】开发基础--文件结构教程
🦖我是Sam9029,一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 🐱🐉🐱🐉恭喜你,若此文你认为写的不错,不要吝啬你的赞扬,求收…...
LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters
在这个视频中,你将了解一些方法和相关的配置参数,这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs,你可能已经看到了这些控制选项,用来调整LLM的行为。每个模型都暴…...
npm的镜像源和代理的查看和修改
一、镜像源 查询当前镜像源 npm get registry 设置为淘宝镜像 npm config set registry http://registry.npm.taobao.org/ 设置回默认的官方镜像 npm config set registry https://registry.npmjs.org/ 设置electron为淘宝镜像 npm config set ELECTRON_MIRROR "h…...
IP库新增经过实践的Verilog 库
网上严重缺乏实用的 Verilog 设计。Project F 库是尝试让 FPGA 初学者变得更好部分。 设计包括 Clock- 时钟生成 (PLL) 和域交叉Display - 显示时序、帧缓冲区、DVI/HDMI 输出Essential- 适用于多种设计的便捷模块Graphics- 绘制线条和形状Maths- 除法、LFSR、平方根、正弦....…...
SLAM-VIO视觉惯性里程计
SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷:融合IMU优势:相机-IMU标定松耦合紧耦合基于滤波的融合方案:基于优化的融合方案: 前言 VIO(visual-inertial odometry)即视觉惯性里程计,有时…...
分布式 RPC 框架入门
分布式 RPC 框架入门 警告 torch.distributed.rpc 程序包是实验性的,随时可能更改。 它还需要 PyTorch 1.4.0才能运行,因为这是第一个支持 RPC 的版本。 本教程使用两个简单的示例来演示如何使用 torch.distributed.rpc 软件包构建分布式训练…...
Spring boot与Spring cloud 之间的关系
Spring boot与Spring cloud 之间的关系 Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用…...
报名开启 | HarmonyOS第一课“营”在暑期系列直播
<HarmonyOS第一课>2023年再次启航! 特邀HarmonyOS布道师云集华为开发者联盟直播间 聚焦HarmonyOS 4版本新特性 邀您一同学习赢好礼! 你准备好了吗? ↓↓↓预约报名↓↓↓ 点击关注了解更多资讯,报名学习...
Apache DolphinScheduler 支持使用 OceanBase 作为元数据库啦!
DolphinScheduler是一个开源的分布式任务调度系统,拥有分布式架构、多任务类型、可视化操作、分布式调度和高可用等特性,适用于大规模分布式任务调度的场景。目前DolphinScheduler支持的元数据库有Mysql、PostgreSQL、H2,如果在业务中需要更好…...
matlab使用教程(17)—广度优先和深度优先搜索
1.可视化广度优先搜索和深度优先搜索 此示例说明如何定义这样的函数:该函数通过突出显示图的节点和边来显示 bfsearch 和 dfsearch 的可视化结果。 创建并绘制一个有向图。 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G dig…...
CSerialPort教程4.3.x (2) - CSerialPort源码简介
CSerialPort教程4.3.x (2) - CSerialPort源码简介 前言 CSerialPort项目是一个基于C/C的轻量级开源跨平台串口类库,可以轻松实现跨平台多操作系统的串口读写,同时还支持C#, Java, Python, Node.js等。 CSerialPort项目的开源协议自 V3.0.0.171216 版本…...
【数据结构OJ题】有效的括号
原题链接:https://leetcode.cn/problems/valid-parentheses/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 这道题目主要考查了栈的特性: 题目的意思主要是要做到3点匹配:类型、顺序、数量。 题目给的例子是比较…...
Java性能分析中常用命令和工具
当涉及到 Java 性能分析时,有一系列强大的命令和工具可以帮助开发人员分析应用程序的性能瓶颈、内存使用情况和线程问题。以下是一些常用的 Java 性能分析命令和工具,以及它们的详细说明和示例。 以下是一些常用的性能分析命令和工具汇总: …...
JVM性能分析-jstat工具观察gc频率
jstat jstat是java自带的工具,在bin目录下 用法 语法:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] [kqkyyj-2 bin]$ jstat -help Usage: jstat -help|-optionsjstat -<option> [-t] [-h&l…...
mysql 查询报错 1267 - Illegal mix of collations
mysql 查询报错 1267 - Illegal mix of collations 详细报错: 1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for 主要的原因其实就是两张表的字符集不一样改一下就行了。 注: 改了表还是报错的话,那就是表内的字段没有…...
【ARM】Day6
cotex-A7核UART总线实验 1. 键盘输入一个字符‘a’,串口工具显示‘b’ 2. 键盘输入一个字符串"nihao",串口工具显示“nihao” uart.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm3…...
深入理解Flink Mailbox线程模型
文章目录 整体设计processMail1.Checkpoint Tigger2.ProcessingTime Timer Trigger processInput兼容SourceStreamTask 整体设计 Mailbox线程模型通过引入阻塞队列配合一个Mailbox线程的方式,可以轻松修改StreamTask内部状态的修改。Checkpoint、ProcessingTime Ti…...
Docker搭建LNMP运行Wordpress平台
一、项目1.1 项目环境1.2 服务器环境1.3 任务需求 二、Linux 系统基础镜像三、Nginx1、建立工作目录2、编写 Dockerfile 脚本3、准备 nginx.conf 配置文件4、生成镜像5、创建自定义网络6、启动镜像容器7、验证 nginx 四、Mysql1、建立工作目录2、编写 Dockerfile3、准备 my.cnf…...
10个常见渐变交互效果
1、透明度渐变背景交互 <div class"fade-background"></div> Copy .fade-background {width: 200px;height: 200px;background: linear-gradient(to bottom, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1));transition: background 0.5s ease; }.fade-backgro…...
[线程/C]基础
文章目录 1. 线程介绍2. 创建线程2.1 线程函数2.2 创建线程 3. 线程退出4. 线程回收4.1 线程函数4.2 回收子线程数据4.2.1 使用子线程栈4.2.2 使用全局变量4.2.3 使用主线程栈 5. 线程分离6. 其他线程函数6.1 线程取消6.2 线程ID的比较 1. 线程介绍 线程是轻量级的进程&#x…...
Spring Clould 负载均衡 - Ribbon
视频地址:微服务(SpringCloudRabbitMQDockerRedis搜索分布式) Ribbon-负载均衡原理(P14) 具体实现时通过LoaBalanced注解实现,表示RestTemplate要被Ribbon拦截处理 orderservice调用user时候,…...
活用DNS技术实现相同IP的不同端口映射不同域名
WindowsDNS基本配置 在内网的 Windows 服务器环境中,你可以通过配置 DNS 服务和 Web 服务器来实现所需的域名解析和端口转发。如下是一些基本的步骤来实现配置: 1,配置 Windows DNS 服务 在你的 Windows 服务器上配置 DNS 服务,…...
AutoHotkey:定时删除目录下指定分钟以前的文件,带UI界面
删除指定目录下,所有在某个指定分钟以前的文件,可以用来清理经常生成很多文件的目录,但又需要保留最新的一部分文件 支持拖放目录到界面 能够记忆设置,下次启动后不用重新设置,可以直接开始 应用场景比如:…...
一文学会sklearn中的交叉验证的方法
前言 在机器学习中,我们经常需要评估模型的性能。而为了准确评估模型的性能,我们需要使用一种有效的评估方法。五折交叉验证(5-fold cross-validation)就是其中一种常用的模型评估方法,用于评估机器学习模型的性能和泛…...
【MySQL面试题(66道)】
文章目录 MySQL面试题(66道)基础1.什么是内连接、外连接、交叉连接、笛卡尔积呢?2.那 MySQL 的内连接、左连接、右连接有有什么区别?3.说一下数据库的三大范式?4.varchar 与 char 的区别?5.blob 和 text 有什么区别?6.…...
CSSCI、北核期刊投稿指南(2023年更新)
该数据为经管类的期刊投稿指南,包含发表难度,文章数量,影响因子,用户评价等指标。共5份文件,分别为国内所有期刊信息库、投稿指南(CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本) 一、…...
构建 NodeJS 影院微服务并使用 docker 部署它(02/4)
一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 图片取自网络 — 封面由我制作 这是✌️“构建 NodeJS 影院微服务”系列的第二篇文章。 二、对第一部分的…...
HTML <style> 标签
实例 <html> <head> <style type="text/css"> h1 {color:red} p {color:blue} </style> </head><body> <h1>Header 1</h1> <p>A paragraph.</p> </body> </html>定义和用法 <style>…...
图片设计师网站/烟台网站建设
这是一个头像类型的小程序源码 支持多种流量主 比如激励视频,Banner,视频,插屏,原生模板等 小程序内包含多种头像非类,都是自动采集 比如男生头像,男声头像,动漫头像等等 另外该小程序还支持姓氏头像生成制作 自定义姓氏输入,标语,印章等输入制作 另外拥有标语选择,可以选…...
企业门户网站建设的必要性/百度搜索关键词推广
最近在用Java调用ffmpeg的命令,所以记录下踩到的坑如果要在Java中调用shell脚本时,可以使用Runtime.exec或ProcessBuilder.start。它们都会返回一个Process对象,通过这个Process可以对获取脚本执行的输出,然后在Java中进行相应处理…...
胶州为企业做网站的公司/重庆森林台词
2019独角兽企业重金招聘Python工程师标准>>> src:http://nanhaochen.blog.51cto.com/228629/47081 又碰到servlet 输出中文乱码的问题,恼火。研究了一下,有了新的发现和认识。 原始代码: java 代码 protected void doGet(HttpServ…...
东阳网站建设/找做网站的公司
我们公司的数据库是这样的:开发环境一台(内网)、生产环境一台、为了在不影响同事使用数据库的前提下编写数据库脚本,我在本机也安装了一台SQL 2008服务器。 这样以来,如何同步这三个库上的存储过程和触发器、索引等经常改变的东西就成了我比较…...
宠物网站素材/文案发布平台
提问嘉宾: 盛国军,上海麦考林信息科技有限公司首席架构师。曾历任8848软件架构师、光芒国际磊客中国技术总监。具有10年互联网和电子商务开发经验,5年软件架构师经验,3年两千万美金投资的大型网站技术总监管理经验。 回答嘉宾&…...
石头科技 网站开发/网络推广销售是做什么的
文章目录云效软件测试和质量保证1. 云效平台测试管理功能介绍2. 云效测试用例3. 云效测试计划4. 云效测试用例执行与报告云效软件测试和质量保证 1. 云效平台测试管理功能介绍 1. 测试管理简介: 云效的「测试管理」功能包含对测试计划与执行用例的创建、编辑、规…...