切面编程AOP:一种优雅的编程范式

目录

1. 引言

2. 什么是AOP?

3. AOP的核心概念

3.1 切面(Aspect)

3.2 通知(Advice)

3.3 切点(Pointcut)

3.4 目标对象(Target Object)

3.5 代理(Proxy)

4. AOP的实现方式

1. 编译时织入

2. 类加载时织入

3. 运行时织入

5. Spring AOP

5.1示例

6. 结论


1. 引言

在软件开发中,我们经常会遇到一些跨多个业务模块的通用功能,比如日志记录、事务管理、权限校验等。这些功能如果分散在各个业务模块中实现,不仅代码重复,而且难以维护。为了解决这个问题,切面编程(Aspect-Oriented Programming,简称AOP)应运而生。AOP是一种编程范式,它允许我们将横切关注点(如日志记录、事务管理)与业务逻辑分离,从而提高代码的模块化和可维护性。

2. 什么是AOP?

AOP是一种编程范式,它通过将程序中的交叉关注点(cross-cutting concerns)分离出来,封装成可重用的模块,从而减少代码重复和提高模块化。在AOP中,这些模块被称为“切面”(Aspect),而切面所影响的代码点被称为“连接点”(Join Point)。通过定义切面,我们可以在不修改原有业务逻辑代码的情况下,为程序添加额外的行为。

3. AOP的核心概念

3.1 切面(Aspect)

切面是AOP的核心,它定义了一组通知(Advice)和切点(Pointcut)。通知定义了在何时何地执行额外行为,而切点则指定了哪些连接点会被切面影响。

3.2 通知(Advice)

通知是切面的具体执行动作,它定义了在切点触发时应该执行的操作。常见的通知类型包括:

  • 前置通知(Before):在目标方法执行之前执行。
  • 后置通知(After):在目标方法执行之后执行,无论方法是否成功。
  • 返回通知(After Returning):在目标方法成功执行后执行。
  • 异常通知(After Throwing):在目标方法抛出异常后执行。
  • 环绕通知(Around):在目标方法执行前后执行,可以控制目标方法的执行。

3.3 切点(Pointcut)

切点用于定义哪些连接点会被切面影响。它通常通过表达式来指定,这些表达式可以匹配方法名、注解、参数等。

3.4 目标对象(Target Object)

目标对象是被通知所修改的对象。

3.5 代理(Proxy)

AOP框架通过创建目标对象的代理来实现切面的织入。代理对象在执行目标对象的方法时,会先执行通知中定义的行为。

4. AOP的实现方式

1. 编译时织入

在编译时,AOP框架会修改字节码,将切面代码织入到目标类中。这种方式的优点是性能较好,但需要特殊的编译器支持。

2. 类加载时织入

在类加载到JVM时,AOP框架会修改字节码,将切面代码织入。这种方式不需要特殊编译器,但可能会影响应用的启动时间。

3. 运行时织入

在运行时,AOP框架通过动态代理技术来实现切面的织入。这是最常见的实现方式,Spring AOP就是基于动态代理的。

5. Spring AOP

Spring框架提供了对AOP的支持,它基于动态代理实现。Spring AOP使用@Aspect注解来定义切面,使用@Pointcut注解来定义切点,使用@Before@After@AfterReturning@AfterThrowing@Around注解来定义不同类型的通知。

5.1示例

@Aspect
@Component
public class LoggingAspect {@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethods() {}@Before("serviceMethods()")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}@After("serviceMethods()")public void logAfter(JoinPoint joinPoint) {System.out.println("After method: " + joinPoint.getSignature().getName());}
}

6. 结论

AOP是一种强大的编程范式,它可以帮助我们更好地组织和管理代码,提高代码的可维护性和可读性。通过使用AOP,我们可以将关注点分离,使得业务逻辑更加清晰,同时实现代码的复用。Spring AOP作为AOP的一种实现,为我们提供了一种简单而强大的方式,来实现切面编程。

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

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

相关文章

【微服务】springboot 实现动态修改接口返回值

目录 一、前言 二、动态修改接口返回结果实现方案总结 2.1 使用反射动态修改返回结果参数 2.1.1 认识反射 2.1.2 反射的作用 2.1.3 反射相关的类 2.1.4 反射实现接口参数动态修改实现思路 2.2 使用ControllerAdvice 注解动态修改返回结果参数​​​​​​​ 2.2.1 注解…

构造性神经组合优化的学习编码需要反悔

文章目录 Abstract1 Introduction2 Related Work用于构造性启发式的深度强化学习当前用于更好编码的方法3 LCH-Regret学习构造性启发式反悔机制LCH - Regret 机制的 L R L_R LR​Abstract 深度强化学习的神经组合优化中,学习构造性启发式(LCH)通过快速的自回归解构建过程实…

【ChromeDriver安装】爬虫必备

以下是安装和配置 chromedriver 的步骤: 1. 确认 Chrome 浏览器版本 打开 Chrome 浏览器,点击右上角的菜单按钮(三个点),选择“帮助” > “关于 Google Chrome”。 2. 下载 Chromedriver 根据你的 Chrome 版本&…

原宝,四周年快乐!

原神,公测于2020年9月28日开启。 现在已经是第4个年头了,7个国家已经开放了6个,来到了火之国。其实自从2022年继续开放游戏版号以来,好品质的二次元游戏、三端游戏也是层出不穷。无论是立绘,建模都有非常优秀的作品。…

Profinet转Modbus485RTU网关同步采集高速响应无需编程轻松组网

Profinet转Modbus485RTU网关同步采集高速响应无需编程轻松组网https://item.taobao.com/item.htm?ftt&id778760672600PROFINET 串口网关 PROFINET 转 RS485 MS-A1-30X1 作为 Profinet 通信的通讯单元进行动作。可通过 Profinet 通信,将 MS-A1-30X1 单元的当前值…

04_OpenCV图片缩放

import cv2 import matplotlib.pyplot as plt # Python 的 2D绘图库# 读入原图片 img cv2.imread(libarary.JPG) # 打印出图片尺寸 print(img.shape) # 将图片高和宽分别赋值给x,y x, y img.shape[0:2]# 显示原图 #cv.imshow(OriginalPicture, img)# 缩放到原来的…

企业级版本管理工具(1)----Git

目录 1.Git是什么 2.Git的安装和使用 在Ubuntu下安装命令如下: 使用git --version查看已安装git的版本: 使用git init初始化仓库: 使用tree .git列出目录: 使用git config命令设置姓名和邮箱: 加入--global选项…

NLP:BERT的介绍

1. BERT 1.1 Transformer Transformer架构是一种基于自注意力机制(self-attention)的神经网络架构,它代替了以前流行的循环神经网络和长短期记忆网络,已经应用到多个自然语言处理方向。   Transformer架构由两个主要部分组成:编码器(Encod…

18年408数据结构

第一题: 解析:这道题很简单,按部就班的做就可以了。 画出S1,S2两个栈的情况: S1: S2: 2 3 - 8 * 5 从S1中依次弹出两个操作数2和3&a…

某客户Oracle RAC无法启动故障快速解决

某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…

DIDIDI~

1 最佳速通时间 小C准备参加某个游戏的速通比赛,为此他对该游戏速通了 n次,每次速通记录可以用一个数组 A{a1,a2……am}表示,其中a表示小C 从游戏开始到第i个游戏节点所花赛的时间,m 为游戏节点的个数。请根据小 C 的速通记录计算…

椭圆距离计算的简单方法

分析发现找到点到椭圆的最近距离等价于求解一元四次方程。想象一下一个圆和一个椭圆最多相交四次。从这个观点出发,问题转化为找到与椭圆仅相交一次的圆。如果用四次方程表示,其中两个根将在交点处共享,而另外两个根将会是复数。 尽管四次方程的封闭解确实存在,但迭代方法更…

肌筋膜炎可以自愈吗

肌筋膜炎是一种临床常见的疾病,主要表现为肌肉的筋膜发生无菌性炎症,可能由多种因素诱发,如风寒侵袭、疲劳、外伤、不良生活习惯及工作姿势等。关于肌筋膜炎是否可以自愈,主要取决于病情的严重程度和个体差异。 一、肌筋膜炎的自…

JMeter压测HTTPS 在window 11处理SSL证书认证

在此位置,找到chrome 的证书 证书到出到指定的路径, 利用jdk中的keytool.exe工具,重新生成证书 crm 去到命令窗口,再去到JDK路径下,如下 输入 keytool -import -alias “zhengshu.store” -file “D:\Program F…

阿里发布Qwen2.5:编程与数学的AI新革命!

阿里发布Qwen2.5:编程与数学的AI新革命! 阿里发布了Qwen2.5系列模型🚀,带来编程和数学领域的超强升级🦸‍♂️。多种规格可选,开源模型推动创新🔓,让AI助手更智能!快来体…

前段辅助工具分享(像素大厨)

引言: 我们在从事前端开发工作时,常会需要测量许多盒子的尺寸,颜色提取种种,切图,还有文字大小等信息,光从肉眼很难看出来,当然我们传统的会使用Photoshop来帮助我们完成这些工作,但…

Cadence23中的一些设置

Allegro AIDT DDR3自动等长Auto-Interactive Delay Tune: Cadence设置好规则之后再做等长就很方便,可以自动等长: 点击SELECT可以选中这一组的线,并进行高亮: 相对误差是15mil: 选择Accordition: 可以通过这个按键查看到底有没有…

OpenCV透视变换:原理、应用与实现

在图像处理与计算机视觉领域,透视变换(Perspective Transformation)是一种强大的工具,它模拟了人眼或相机镜头观看三维空间物体时的透视效果,从而改变图像的视角和形状。本文将详细介绍透视变换的原理、应用场景以及如…

程序员数学 | 数学归纳法

目录 一、数学归纳法是什么二、使用编程来模拟数学归纳法的证明 人类做重复性的劳动没有效率,而计算机却能更快更准确的完成重复性劳动。所以以重复为特点的迭代法在编程中有着⼴泛的应⽤。实际项目中是否可以用不断更新变量值或者缩小搜索的区间范围的方法&#xf…

SAP EWM QM 集成

目录 1 简介 2 业务流程 3 后台配置 4 主数据 5 业务操作 5.1 创建 EWM 交货单 5.2 不同的质检结果导致不同的入库地点 - 质检通过 5.3 不同的质检结果导致不同的入库地点 - 质检失败 1 简介 EWM 与 QM (quality management) 集成,自动 or 手动执行质检流程。质检可以…