Spring系统学习-什么是AOP?为啥使用AOP?

问题思考

我们为啥要使用AOP?
来看一个案例:

声明计算器接口Calculator,包含加减乘除的抽象方法

public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);
}

在这里插入图片描述

public class CalculatorPureImpl implements Calculator {@Overridepublic int add(int i, int j) {int result = i + j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int sub(int i, int j) {int result = i - j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int mul(int i, int j) {int result = i * j;System.out.println("方法内部 result = " + result);return result;}@Overridepublic int div(int i, int j) {int result = i / j;System.out.println("方法内部 result = " + result);return result;}
}

创建带日志功能的实现类
在这里插入图片描述

public class CalculatorLogImpl implements Calculator {@Overridepublic int add(int i, int j) {System.out.println("[日志] add 方法开始了,参数是:" + i + "," + j);int result = i + j;System.out.println("方法内部 result = " + result);System.out.println("[日志] add 方法结束了,结果是:" + result);return result;}@Overridepublic int sub(int i, int j) {System.out.println("[日志] sub 方法开始了,参数是:" + i + "," + j);int result = i - j;System.out.println("方法内部 result = " + result);System.out.println("[日志] sub 方法结束了,结果是:" + result);return result;}@Overridepublic int mul(int i, int j) {System.out.println("[日志] mul 方法开始了,参数是:" + i + "," + j);int result = i * j;System.out.println("方法内部 result = " + result);System.out.println("[日志] mul 方法结束了,结果是:" + result);return result;}@Overridepublic int div(int i, int j) {System.out.println("[日志] div 方法开始了,参数是:" + i + "," + j);int result = i / j;System.out.println("方法内部 result = " + result);System.out.println("[日志] div 方法结束了,结果是:" + result);return result;}
}

这个时候我们发现代码缺陷:

  • 对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力
  • 附加功能分散在各个业务功能方法中,不利于统一维护

解决这两个问题,核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。

解决问题的困难:要抽取的代码在方法内部,靠以前把子类中的重复代码抽取到父类的方式没法解决。所以需要引入新的技术。

这其实就是我们的AOP思想 - 解耦

AOP概述

Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的支持。它允许开发者通过定义切面(Aspect)来将横切关注点(Cross-cutting Concerns)与核心业务逻辑分离,从而提高代码的可维护性和可重用性。

在Spring AOP中,切面是一个模块化的单元,它横跨多个类和对象,用于封装横切关注点。横切关注点是那些在应用程序中散布在各处的功能,如日志记录、事务管理、安全性等,它们与核心业务逻辑无关,但又需要在多个地方重复使用。

Spring AOP通过使用代理模式和动态代理技术,在运行时动态地将切面织入到目标对象的方法中,从而实现横切关注点的功能。开发者可以使用注解或XML配置来定义切面和切点,以及指定切面的行为和执行时机。

Spring AOP的核心概念包括:

  • Aspect(切面):封装了横切关注点的模块。一个切面是由多个join points和相关的advice组成。

  • Join Point(连接点):在程序执行过程中的某个点,如方法调用或异常抛出,可以被AOP织入的地方。

  • Advice(通知):在特定的join point执行的代码,如before、after、around等类型的通知。

  • Pointcut(切入点):一个或多个join points的集合,通过表达式语言来定义哪些join points会被编织上advice。

  • Weaving(织入):将aspect和advice插入到程序的join points的过程,Spring AOP在运行时通过代理实现这一点。

  • Target Object(目标对象):被通知的对象,即被AOP增强的真实对象。

  • Proxy(代理):包含目标对象以及附加的AOP行为的对象。

Spring AOP主要通过两种代理机制实现AOP:

  • JDK动态代理:用于实现接口的代理,利用Java反射机制创建代理对象。

  • CGLIB(Code Generation Library):用于实现类的代理,通过字节码生成库来创建子类对象。

通过使用Spring AOP,开发者可以更容易地维护和扩展应用,因为那些与业务逻辑无关的代码可以被集中管理和修改,而不必改动核心的业务逻辑代码。这有助于降低系统复杂度,提高代码的可读性和可维护性。

为啥Spring 要使用AOP?

Spring框架选择使用AOP(Aspect Oriented Programming,面向切面编程)的主要原因在于解决传统面向对象编程(OOP)中遇到的一些挑战,特别是在处理横切关注点(cross-cutting concerns)方面。下面列出了一些关键的原因:

  • 解耦合:在OOP中,横切关注点(如日志记录、缓存、权限检查、事务管理等)常常需要在多个地方重复编码,这导致代码耦合度高,难以维护和扩展。AOP允许将这些关注点从核心业务逻辑中分离出来,降低系统的耦合度。

  • 代码重用和模块化:通过AOP,你可以编写一次横切关注点的代码,并在多个不同的地方使用它,无需在每个受影响的模块中重复相同的代码。这提高了代码的重用性和模块化。

  • 简化开发和维护:AOP使得开发人员可以专注于业务逻辑的实现,而将通用的服务(如日志、事务管理)留给AOP切面处理。这不仅简化了开发流程,也便于后期维护,因为所有的日志或事务相关代码都集中在一个地方。

  • 透明性:使用AOP,可以向现有代码添加新的功能,而无需修改原有代码。例如,如果需要在所有数据库操作前后添加日志记录,可以通过AOP轻松实现,而不需要修改每个涉及数据库操作的方法。

  • 灵活的配置:Spring AOP允许通过XML配置文件或者注解来定义切点(pointcuts)、通知(advice)和切面(aspects),这提供了非常灵活的配置选项,使得开发者可以根据需要轻松调整AOP的行为。

  • 事务管理:Spring AOP特别擅长处理事务管理。通过声明式事务管理,开发者只需在配置文件或注解中指定事务边界,而不需要在代码中显式地管理事务的开始和结束。

  • 性能优势:虽然AOP引入了额外的运行时开销,但由于它减少了代码的重复和耦合,总体上可以带来更好的性能,尤其是在大型企业级应用中。

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

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

相关文章

JS(JavaScript)数据校验 表单校验-案例

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中,生成随机数是一种常见的需求,无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中,我们将通过一…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤: ① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL; ② 我们还要断言一下,指定的…

ctfshow sql注入 web234--web241

web234 $sql "update ctfshow_user set pass {$password} where username {$username};";这里被过滤了,所以我们用\转义使得变为普通字符 $sql "update ctfshow_user set pass \ where username {$username};";那么这里的话 pass\ where…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

小程序-<web-view>嵌套H5页面支付功能

背景:小程序未发布前,公司使用vue框架搭建了管理系统,为了减少开发成本,微信提供了web-view来帮助已有系统能在小程序上发布,详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能,导致用…

AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?

随着科技的飞速发展,人工智能生成内容(AIGC)技术在设计行业的应用日益广泛,引发了广泛的讨论和关注。AIGC以其高效、多样化的生成能力,为设计行业带来了前所未有的变革。然而,关于AIGC是否能替代真正的设计…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读:随着快成物流的大宗商品产业链的不断发展,货运轨迹规划和实时数据分析的需求日益迫切,为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能,快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统,内置终端Shell,这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇,由于应用众多,一锅炖不下,故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中,由于事件的不同,动作的不同,角色会处于不同的状态中。例如对战冒险游戏,面临Boss的攻击,角色会受到例如中毒,恐惧等Debuff效果,若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生,在之前的新版本NewJeans联动中,由于一些官方设定的错误,导致在开典藏箱的时候出现了一些问题,官方也推出了相应的补偿措施,比如退还G币,回收典藏箱子开出来的东…

Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说,可以在没有系统的情况…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线,每位玩家都能在这里开启全新的时空冒险之旅,主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本,以及日常任务为主,在以往的手游中,玩家进入某项玩法只需要从游戏界面调取菜单即可&#…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端,但是有时候前端的样式太丑了,也有点看不下去。弹出框是项目中用的比较多的,比如删除,修改或者添加什么的,都需要一个弹出框。 所以这里简单记录一下,应该如何实现。实现效果如…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作,按照规定的维护服务要求,外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…

offer150-16:数值的整数次方

题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数,同时不需要考虑大数问题。 分析,题目要求实现库函数pow(),由于不需要考虑大数问题,不必担心溢出,那么就需要对输入的各种情况进…

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 目录 预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 2.运行环境为Matlab2023b及以上; 3…