Spring 5 笔记 - AOP

news2025/4/12 10:23:23

1. AOP 简介

AOP:Aspect Oriented Programming, 面向切面编程或面向方面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。

2. AOP 底层原理

2.1 AOP底层使用动态代理

第一种:有接口的情况,使用JDK动态代理

  • 创建接口实现类代理对象,增强类的方法。

第二种:没有接口的情况,使用CGLIB动态代理

  • 创建子类的代理对象,增强类的方法。

AOP(JDK 动态代理)

  1. 使用JDK动态代理, 使用Proxy类里面的方法创建动态代理对象。

(1)调用newProxyInstance方法

方法有三个参数:

第一个参数:类加载器。

第二个参数:增强方法所在的类,这个类实现的接口,支出多个接口。

第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的方法。

JDK动态代理例子:

(1)创建接口,定义方法。

(2)创建接口实现类,实现方法。

(3)使用Proxy类创建接口代理对象

2.2 AOP术语

(1)连接点:类里面哪些方法可以被增强,这些方法称为连接点

(2)切入点:实际被真正增强的方法,称为切入点。

(3)通知(增强):实际增强的逻辑部分称为通知(增强)

通知有多种类型:

  • 前置通知:方法之前通知
  • 后置通知:方法之后通知
  • 环绕通知:方法之前之后都通知
  • 异常通知:方法异常时通知
  • 最终通知:类似于finally里的逻辑

(4)切面:是个动作,把通知应用到切入点的过程。

2.3 AOP操作(准备)

(1)Spring框架一般都是基于AspectJ实现AOP操作

  • 什么是AspectJ ?AspectJ不是Spring的组成部分,独立的AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作。

(2)基于AspectJ实现AOP操作

  1. 基于xml配置文件实现
  2. 基于注解方式实现(实际使用得多)

(3)在项目工程里面引入AOP相关依赖

还需要其它三个Jar包来支持AspectJ,所需要的AspectJ支持包来源于Eclipse下面的一个子项目AspectJ,可到此项目的官网地址下载AspectJ支持包。同时也要下载aopalliance包并添加到项目中。

AspectJ支持包下载地址:AspectJ Downloads | The Eclipse Foundation

选择合适的版本下载,下载的是一个.jar包。

Aopalliance下载地址:

方法一:Aopalliance下载地址:AOP Alliance (Java/J2EE AOP standard) - Browse /aopalliance at SourceForge.net,选择合适的版本进行下载

TIPS:如果有找不到的jar包,可到Compare, Download & Develop Open Source & Business Software - SourceForge 里找,一般都有的

方法二:Aopalliance下载地址:Index of /aopalliance

TIPS:如果找不到jar包,可到Index of里找,一般都有的

cglib的jar包下载地址:

Download cglib-2.1.95-sources.jar : cglib « c « Jar File Download

二、解压

AspectJ支持包解压:用压缩软件解压该jar包,并把解压后的文件夹放到合适的位置。如下图:

Aopalliance解压:用压缩软件解压,并把解压后的文件夹放到合适的位置。如下图:

下载完后需要导入如下三个Jar包:

将上面一共四个Jar包引入项目:

4)切入点表达式

  • 切入点表达式的作用:知道对哪个类里面的哪个方法进行增强。
  • 语法结构:

execution(【权限修饰符】【返回类型】【类全路径】【方法名称】(【参数列表】))

举例1:对com.menergy.spring5.UserDaoImpl类中的add方法进行增强

execution(* com.menergy.spring5.UserDaoImpl.add(..))

举例2:对com.menergy.spring5.UserDaoImpl类中的所有方法进行增强

execution(* com.menergy.spring5.UserDaoImpl.*(..))

举例3:对com.menergy.spring5包中的所有类中的所有方法进行增强

execution(* com.menergy.spring5.*.*(..))

2.4 AOP操作实例(AspectJ注解)

(1)创建类,在类里面定义方法

(2)创建增强类(编写增强逻辑)

  • 在增强类里面创建方法,让不同的方法代表不同的通知类型。

(3)进行通知的配置

步骤:

  1. 在Spring 的配置文件中,开启注解扫描(这里引入context和aop两个名称空间)。
  2. 使用注解创建User和UserProxy对象。
  3. 在增强类上面添加注解@Aspect。
  4. 在Spring 的配置文件中开启生成代理对象。
  • 在增强类里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置。

例子:

加入其它类型的通知进行测试:

测试异常通知:

注:异常发生时,“环绕之后”和“afterReturning(返回通知)”没有执行。

可以对公共切入点进行抽取:

多个增强类对同一个方法进行增强,可以设置增强类的优先级:

  • 在增强类上面添加注解@Order(数字类型值),数字值越小优先级越高

例子:其它同上,改变如下:

完全注解开发

原来的配置文件可以用一个配置类代替(不需要xml配置文件),如下:

原来的配置文件:

用配置类代替为:

2.5 AOP操作实例(AspectJ配置文件)

  1. 创建两个类,增强类和被增强类,创建方法
  2. 在Spring 配置文件中创建两个类的对象
  3. 在Spring 配置文件中配置切入点

例子:

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

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

相关文章

【英语】大学英语CET考试,写作部分(论述文+应用文,6篇范文)

文章目录 3项评分标准(内容&结构,语言)0.1 论述文个人小结 1、论述文:审题与功能句2、论述文:修饰内容和名言模板3、论述文:现象作文&利弊分析4、论述文:给出权威论据和有侧重的现象5、…

新老stp的配置和安全总结部分

老stp只有根桥没有备份桥 老stp的五种接口状态: disable 接口down没开stp blocking 阻塞 listening 发bpdu,比较bpdu优劣 leraning 开始学习mac地址表 forwardding 转发 老stp直接拓扑变化30秒,间接拓扑变化50秒 RSTP只有3种端口状态&#…

每日学术速递4.28

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.StepFormer: Self-supervised Step Discovery and Localization in Instructional Videos(CVPR 2023) 标题:StepFormer:教学视频中的自我监督步骤发现和定位…

vue diff算法与虚拟dom知识整理(1) 概念叙述

今天开始 我们来学习 虚拟dom和diff算法 首先 我们要简单了解 虚拟dom和diff算法在vue中的作用 例如 下图左侧是我们的加 然后 我们要将 家按图右改造一下 我们先来找一下不同 如图卷出来的效果 我们起居室想多装一个沙发 卧室床改了位置 电视不要了 阳台小改了一下 其实改…

每日学术速递4.27

Subjects: cs.CV 1.End-to-End Spatio-Temporal Action Localisation with Video Transformers 标题:使用视频转换器进行端到端时空动作定位 作者:Alexey Gritsenko, Xuehan Xiong, Josip Djolonga, Mostafa Dehghani, Chen Sun, Mario Lučić, Corde…

IS-IS协议基础知识

文章目录 前言介绍地址格式报文格式区域及路由器类型区域类型路由器类型Level-1 路由器Level-2 路由器Level-1-2路由器 IS-IS 网络类型DIS及伪节点伪节点DIS与OSPF的DR/BDR不同之处 IS-IS 邻接关系握手报文邻接关系的建立 IS-IS 链路状态数据库概述数据库同步报文泛洪机制数据库…

【网络编程】socket套接字

文章目录 一、源IP和目的IP二、端口号port三、TCP/UDP协议3.1 网络字节流 四、socket套接字4.1 socket常见接口4.2 sockaddr结构体 五、总结 一、源IP和目的IP 如果我们的台式机或者笔记本没有IP地址就无法上网,而因为每台主机都有IP地址,所以注定了数据…

Prometheus Exporter开发

Prometheus Exporter开发 Exporter数据格式介绍 Exporter徒手开发 Exporter4种指标类型演示 Exporter自定义注册表 Exporter 基于Collector的模块开发 Exporter介绍 数据格式 通讯协议 HTTP协议服务端实现了gzip 数据格式 text/plain:文本协议 数据格式 prometheus…

MySQL性能监控全掌握,快来get关键指标及采集方法!

数据库中间件监控实战,MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题,提升数据库可用性。 1 整体思路 监控哪类指标? 如何采集数据? 第10讲监控方法论如何落地? 这些就可以在MySQL中应用起来。…

ChatGPT提示词工程(四):Inferring推断

目录 一、说明二、安装环境三、推断(Inferring)1. 推断情绪(正面 / 负面)2. 确定情绪的类型3. 识别愤怒4. 从客户评论中提取产品和公司名称5. 一次完成多项任务6. 推断主题7. 主题中是否包含给定的主题 一、说明 这是吴恩达 《Ch…

【栈】的实现

🖊作者 : D. Star. 📘专栏 : 数据结构 😆今日分享 : —>📖区块链 : 小明向你借100块钱,说一周后还你,然后你拿个喇叭大喊一声:我是某某,小明向我借了100块&#xff0c…

Redis缓存(双写一致性问题)

Redis缓存(双写一致性问题) 1 什么是缓存?1.1 为什么要使用缓存1.2 如何使用缓存 2 添加缓存2.1 、缓存模型和思路2.2、代码如下 3 缓存更新策略3.1 、数据库缓存不一致解决方案:3.2 、数据库和缓存不一致采用什么方案 4 实现商铺和缓存与数…

【C生万物】 指针篇 (初级)

欢迎来到 Claffic 的博客 💞💞💞 👉 专栏:《C生万物 | 先来学C》👈 前言: 面对C语言,很多童鞋都会高呼:指针难,指针难&#x…

【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换

利用空档期时间学习一下计算机系统基础,以前对这些知识只停留在应试层面,今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC,参考书籍也是袁老师的教材,这是我的听课自查资料整理后的笔记 W2-1十进制…

ChatGPT背后的技术:人类反馈强化学习RLHF

文章目录 前言Chat GPT是如何基于RLHF进行训练的RLHF 技术分解预训练语言模型训练奖励模型强化学习微调预训练模型 局限性参考 前言 随着OpenAI推出的Chat GPT火热出圈,Chat GPT背后的技术原理之一,人类反馈强化学习RLHF (Reinforcement Learning from …

Matplotlib 网格线

我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下: matplotlib.pyplot.grid(bNone, whichmajor, axisboth, ) 参数说明: b:可选,默认为 None,可以设置布尔值,true…

prometheus实战之二:使用常见指标

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《prometheus实战》系列的第二篇,在《prometheus实战之一:用ansible部署》一文咱们部署了prometheus服务&#xff0c…

防护服穿戴检测识别算法 yolov8

防护服穿戴检测识别系统基于yolov8网络模型图片数据识别训练,算法模型自动完成对现场人员是否按照要求穿戴行为实时分析。YOLOv8 算法的核心特性和改动可以归结为如下:提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网…

【开发工具】 我居然可以使用Office Tool Plus 安装上Office 真的是太不可思议了

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

【开发工具】 Office Tool Plus 居然也可以部署 Office 365 我的天 真的是太厉害了

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…