【Spring知识点介绍 | 第二篇】什么是AOP

news2024/11/17 9:54:56

前言:

在本文中,我们将介绍AOP的基本概念、原理和核心组件。我们将探讨AOP的作用、优势以及如何在实际应用中使用AOP来提升软件开发的效率和质量。无论是新手还是资深开发人员,都将受益于对AOP的理解和应用。

希望本文能够帮助读者对AOP有一个全面的认识,并鼓励他们在日常的软件开发中积极运用AOP的思想和技术,为构建高质量的软件系统做出贡献。

目录

前言:

什么是AOP:

AOP案例演示: 

AOP应用场景:

AOP的优势:

AOP常见名词概念:

总结:


什么是AOP:

AOP全称为面向切面编程(Aspect-Oriented Programming),是一种软件开发技术和编程范式。它旨在解决横切关注点(Cross-cutting Concerns)的问题,即解决那些散布在应用程序中的通用功能或行为,与核心业务逻辑无关,却影响到多个模块的代码。

在传统的面向对象编程(OOP)中,程序的功能被组织为一个个类,而横切关注点则被分散地插入到这些类的方法中。这样一来,关注点的逻辑散布在整个代码库中,导致代码的可读性、可维护性和复用性下降。

AOP的核心概念是切面(Aspect),切面是对横切关注点的抽象。它包含了影响多个模块的共同行为逻辑,例如日志记录、事务管理、安全性检查等。通过AOP,我们可以将这些横切关注点抽取出来,形成独立的切面,并将其与核心业务逻辑相分离。

 假设我们有多个方法,我们要对多个方法进行统计耗时,那么按照我们以前的思路来讲:就是统计时间,最繁琐的方法就是给每一个方法都进行前后时间统计。而我们选择抽象出来一个模板类,使得整体的结构变为:
 

------------------
获取方法开启时间
------------------
运行原始方法(需要统计耗时的方法)
------------------
获取方法运行结束时间

我们把获取方法开启时间和获取方法结束时间抽取出来,成为一个模板方法

而面向这样一个或者多个方法,开发针对其内部的通用功能或者行为,就叫做面向切面编程 

其实AOP这项技术,和我们之前在JAVASE中学习的动态代理技术非常相似 ,如果大家还是没有理解透彻AOP的核心逻辑,可以看一看动态代理的相关文章,这会对我们理解AOP技术起到很大的帮助。

【从零开始学习JAVA | 第四十五篇】动态代理_我是一盘牛肉的博客-CSDN博客

动态代理也是面向切面编程最主流的方式 ,而SpringAOP是Spring框架中的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

AOP案例演示: 

我们演示一下在spring boot框架中如何利用AOP完成统计方法用时:

1.引入依赖项 aop:

  <!--spring AOP依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 2.编写代码:

@Slf4j
@Component//交给IOC容器进行管理,成为一个bean对象
@Aspect//表明当前类是一个AOP类
public class TimeAspect {
    @Around("execution(* com.example.mybatistest03.service.*.*(..))")//切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //1.记录开始时间
        long start = System.currentTimeMillis();

        //2,调用原始方法运行
        Object result = joinPoint.proceed();
        //3.记录结束时间,计算方法执行时间
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature() +"方法耗时{}ms",end-start);

        return result;
    }

}

结果展示:

AOP应用场景:

  1. 日志记录:日志是在应用程序中记录关键操作和事件的重要方式。使用AOP,您可以在方法执行前后或异常发生时,自动插入日志记录的逻辑,从而获得更详细的应用程序执行日志。这可以帮助跟踪应用程序的执行流程、排查问题和进行性能分析。

  2. 安全控制:安全是任何应用程序都应该考虑的一个关键方面。通过AOP,可以在敏感操作前插入安全检查的逻辑,例如身份验证、权限验证和数据加密等。这样可以确保只有经过授权的用户才能执行某些操作,提高系统的安全性。

  3. 事务管理:在需要处理数据库事务的应用程序中,使用AOP可以将事务处理逻辑与核心业务逻辑分离。通过在方法执行前后插入事务管理的逻辑,可以确保数据的一致性和完整性,以及在发生异常时进行数据回滚。

  4. 缓存管理:在处理频繁读取的数据时,可以使用AOP将缓存管理逻辑与业务逻辑分离。通过在方法执行前检查缓存中是否存在数据,并在缓存中读取数据时绕过实际的业务逻辑,可以提高系统的性能和响应速度。

  5. 异常处理:异常处理是应用程序开发中重要的一环。使用AOP,可以集中管理异常处理逻辑,而不需要将异常处理代码分散在多个方法中。这样可以提高代码的可读性、可维护性,并降低在处理异常时的代码冗余。

  6. 性能监控:通过AOP,您可以在方法执行前后或者固定时间间隔内,插入性能监控的逻辑。这可以用来收集方法的执行时间、资源使用情况和其他指标,以帮助分析和优化系统的性能。

这些只是AOP应用场景的一些例子,实际应用中的可能性还很多。AOP的主要目标是通过将横切关注点从核心业务逻辑中提取出来,提高代码的重用性、简洁性和可维护性。具体应用的选择取决于您的需求和系统架构。

AOP的优势:

  1. 横切关注点的分离:AOP通过将与核心业务逻辑无关的横切关注点(如日志、事务、安全等)从业务代码中分离出来,提高了代码的可读性和可维护性。横切关注点可以独立于核心业务处理,易于理解和修改。

  2. 代码重用和模块化:AOP允许将横切关注点的代码逻辑封装为可重用的模块。这些模块可以在不同的应用程序和模块中共享,提高了代码的复用性和可维护性。通过简化重复代码的编写,AOP有助于减少开发时间和减少代码冗余。

  3. 横向功能扩展:AOP使得在应用程序中添加新的功能变得更加容易。通过在不修改现有核心逻辑的情况下,将新的横切关注点插入到代码中,可以灵活地扩展应用的功能。这样可以提高系统的扩展性和灵活性。

  4. 集中化管理:AOP将横切关注点的逻辑集中到一个地方,可以更好地管理和维护这些关注点。例如,可以使用一个切面来管理日志记录,而不需要将日志记录的代码分散在整个应用程序中。这简化了代码维护和修改的复杂性。

  5. 提高系统性能:AOP可以帮助优化系统性能。通过将横切关注点独立出来,可以避免在核心业务逻辑中重复执行耗时的操作。例如,将缓存管理逻辑应用于频繁读取的数据,可以提高系统的响应速度和吞吐量。

  6. 降低耦合性:AOP通过解耦横切关注点和核心业务逻辑,减少了模块间的依赖和耦合性。这使得系统更容易进行单元测试、集成测试和模块替换,提高了代码的可测试性和灵活性。

总的来说,AOP提供了一种有效的方式来管理和处理与核心业务逻辑无关的横切关注点。它通过分离关注点、提高代码的重用性和可维护性、扩展应用功能和提高性能等方面的优点,为软件开发带来了许多好处。

AOP常见名词概念:

1.连接点:

在AOP中,连接点(Join Point)是指在程序执行过程中,能够被插入横切关注点的特定位置。换句话说,连接点是程序执行过程中的一个具体的点或事件。

连接点可以是方法的调用、方法的执行、异常的抛出、字段的访问、对象的创建等。它们代表了在应用程序执行期间可被AOP框架拦截和处理的特定位置。

连接点就是可以被AOP控制的方法

2.通知:

在AOP中,通知(Advice)是指切面在特定的连接点上执行的代码。通知定义了在横切关注点处执行的逻辑,它是AOP中实际操作的部分。(其实就是共性逻辑)

通知就是被抽取出来的重复功能,在示例中就表现为统计方法的耗时

3.切入点:

AOP中,切入点(Pointcut)是指在应用程序中选择特定连接点的表达式。切入点定义了在哪些连接点上将会触发横切关注点的执行。

切入点使用特定的表达式语法来描述需要匹配的连接点。通过定义切入点,我们可以精确地指定在哪些位置或事件上触发切面的逻辑。

切入点表达式可以基于连接点的类型、方法的签名、方法的访问修饰符,甚至是方法的参数等。

切入点就是实际被AOP控制的方法 

4.目标对象:

在AOP中,目标对象(Target Object)是指在应用程序中被真正执行和被增强的对象。它是被切面所影响的对象,也是横切关注点所应用的对象。

目标对象通常是应用程序中的一个普通对象,它负责执行核心业务逻辑。切面可以通过拦截目标对象的方法调用,在执行前、执行后或异常抛出时插入额外的逻辑。

 目标对象就是此时通知所应用在哪一个对象上,哪一个对象就是目标对象

切入点表达式  +  通知  =  切面 

总结:

当谈到AOP(面向切面编程)时,它是一种强大且实用的编程范式,具有许多优点。通过AOP,我们可以将与核心业务逻辑无关的横切关注点(如日志、事务、安全等)从业务代码中分离出来,提高了代码的可读性、可维护性和重用性。

AOP的优点包括横切关注点的分离,使其易于理解和修改。它通过提供代码重用和模块化的机制,减少了开发时间和代码冗余。通过将新的功能作为横切关注点添加到应用程序中,AOP提供了一种灵活扩展应用功能的方式。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

MineDojo - “我的世界” 基础上构建的 具身智能体仿真组件

关于 MineDojo Building Open-Ended Embodied Agents with Internet-Scale Knowledge github : https://github.com/MineDojo/MineDojo论文&#xff1a;MineDojo: Building Open-Ended Embodied Agents with Internet-Scale Knowledge https://arxiv.org/abs/2206.08853 Min…

Linux安装 spark 教程详解

目录 一 准备安装包 二 安装 scala 三 修改配置文件 1&#xff09;修改 workers 文件 2&#xff09;修改 spark-env.sh文件 四 进入 spark 交互式平台 一 准备安装包 可以自行去 spark 官网下载想要的版本 这里准备了 spark3.1.2的网盘资源 链接: https://pan.baidu.com…

stl 输入输出流

标准输入输出流 头文件 iostream 从标准输入读取流 cin >> 从标准输出写入流 cout << get 系列函数 get 无参数&#xff1a;cin.get() 从指定的输入流中提取一个字符&#xff08;包括空白字符&#xff09;&#xff0c;若读取成功&#xff0c;返回该字符的 ASC…

css--踩坑

1. 子元素的宽高不生效问题 设置flex布局后&#xff0c;子元素的宽高不生效问题。 如果希望子元素的宽高生效&#xff0c;解决方法&#xff0c;给子元素添加如下属性&#xff1a; flex-shrink: 0; flex-shrink: 0;2. 横向滚动&#xff08;子元素宽度不固定&#xff09; /* tab…

K8s学习笔记5

安装Kubernetes&#xff1a; 主机名IP地址角色master192.168.17.131master结点node1192.168.17.132nodenode2192.168.17.133node 设置主机名&#xff1a; [rootlocalhost ~]# hostnamectl set-hostname master[rootlocalhost ~]# hostnamectl set-hostname node1[rootlocalho…

尤雨溪:Vite的现状与未来展望

10 月 5 日 - 6 日&#xff0c;ViteConf 2023 在线举行&#xff0c;Vue 和 Vite 的创建者尤雨溪发表了题为《The State of Vite》 的演讲&#xff0c;他分享了 Vite 的现状与未来展望&#xff0c;本文就来看一看 Vite 现在怎么样了&#xff0c;以及未来的路将怎么走&#xff01…

港联证券:a股b股区别?

A股和B股是指中国大陆股市中的两类股票&#xff0c;两者在法律规定、税收、流转规划和出资者身份等多个方面都有较大不同。下面从多个视点分析A股B股的差异。 一、法律规定 在中国大陆股市中&#xff0c;A股是指在上海证券生意所和深圳证券生意所上市流转的股票&#xff0c;只…

IDEA对比两个文件的内容

提前说明&#xff1a;IDEA可以用对比功能对比两个文件的内容&#xff0c;适合对比大部分内容重复&#xff0c;少部分内容有变化的两个文件。 第一步&#xff1a;鼠标点击选中一个文件 第二步&#xff1a;按照Ctrl的同时&#xff0c;鼠标左键再点击选择另一个文件 第三步&#…

零基础如何自学网络安全,基于就业前景全方位讲解,包教包会

你是否对网络空间安全充满好奇&#xff1f;想要解开网络世界神秘的面纱&#xff1f;你是否对黑客技术着迷&#xff1f;而找不到合适的学习途径&#xff1f;你是否遭到过各种各样的网络攻击&#xff0c;却因知识的匮乏束手无策&#xff1f; 那么接下来将为你全面介绍&#xff0c…

【算法练习Day14】二叉树的最大深度二叉树的最小深度完全二叉树的节点个数

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉树的最大深度二叉树的最…

插入排序/折半插入排序

插入排序/折半插入排序 插入排序 插入排序(英语&#xff1a;Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…

IDEA中字符串怎么自动转义,双引号自动转义的小技巧

1.选中要填写的字符串 &#xff0c;按altenter 2.点击 Inject language or reference&#xff0c;选择JSON组件 3.再次按altenter&#xff0c;点击Edit JSON Fragment 4.在弹出的窗口编辑源字符串&#xff0c;代码中字符串就能自动转义了

ThreeJS-3D教学五-材质

我们在ThreeJS-3D教学二&#xff1a;基础形状展示中有简单介绍过一些常用的材质&#xff0c;这次我们举例来具体看下效果&#xff1a; 代码是这样的&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

4.绘制颜色点(点击)

愿你出走半生,归来仍是少年&#xff01; 在点击绘制点的基础上&#xff0c;通过片源着色器给每个点设置颜色。以原点为中心&#xff0c;在一象限的点为红色&#xff0c;三象限为绿色&#xff0c;其他象限为白色。 1.知识点 1.1.Uniform变量 向片源着色器传入的数据变量。 1.…

1700*D. Flowers(DP前缀和预处理打表)

Problem - 474D - Codeforces 题意&#xff1a; 有白花和红花两种&#xff0c;把 x 朵花排成一排&#xff0c;要求白花必须连续 k 个一块放置&#xff0c;则有 cnt 种情况。给出 a 和 b&#xff0c;计算a到b之间的 x 对应的 cnt 总和&#xff0c;并且对1e97取模。 解析&#x…

第二证券:A股反弹已至?9月最牛金股涨超41%

进入10月&#xff0c;作为券商月度战略精华的新一期金股也连续宣布。 从各券商关于十月份的大势研判来看&#xff0c;一些券商达观地认为反弹行情正在打开&#xff0c;也有一些券商认为仍是轰动市。具体配备上&#xff0c;AI、科创相关的标的仍然遭到喜欢&#xff0c;一起不少…

OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击

作者&#xff1a;gentle_zhou 原文链接&#xff1a;OWASP Top 10漏洞解析&#xff08;3&#xff09;- A3:Injection 注入攻击-云社区-华为云 Web应用程序安全一直是一个重要的话题&#xff0c;它不但关系到网络用户的隐私&#xff0c;财产&#xff0c;而且关系着用户对程序的新…

SAP BC TSV_TNEW_PAGE_ALLOC_FAILED

解决方案&#xff1a; 1)业务上&#xff0c;限制数据量&#xff0c;分多次查数据 2)调整参数 临时调整 se38 -rsmemory

PLC之间无线通信-不用编程实现多品牌PLC无线通讯的解决方案

本文是PLC设备之间基于IGT-DSER系列智能网关实现WIFI无线通讯的案例。采用西门子S7-1500系列的PLC作为主站&#xff0c;与其它品牌的PLC之间进行网络通讯。案例包括智能网关AP方式、现场WIFI信号两种方式。有线以太网方式实现PLC之间通讯的案例 一、智能网关AP方式 将网络中的其…

Vercel部署个人静态之DNS污染劫持问题

vercel是我第一次接触静态网站托管所使用的服务&#xff0c;类似的还有github以及Netfily。但是Vercel的自动化构建远比github page方便的多。通过github授权给Vercel就实现了自动拉取构建及发布的一系列流程。在本地推送代码可以使用小乌龟工具&#xff0c;线上代码发布使用Ve…