Spring 框架中AOP(面向切面编程)和 IoC(控制反转)

在 Spring 框架中,AOP(面向切面编程)和 IoC(控制反转)是两个核心概念,它们分别负责不同的功能。下面我将通过通俗易懂的解释来帮助你理解这两个概念。

  1. IoC(控制反转)

IoC 是 Inversion of Control 的缩写,意思是控制反转。它的核心思想是 控制权的转移,即从传统的程序员自己控制对象的创建和生命周期转移到框架(Spring)来控制。
通俗解释:

假设你有一个餐厅,传统的做法是顾客进入餐厅后,自己去厨房点菜,然后自己做饭。这样,顾客对菜品的制作过程有完全的控制权。

而 IoC 就是反过来了——顾客只需要坐下,餐厅会根据顾客的要求(比如菜单)自动给出菜肴,顾客不需要自己去厨房做菜。换句话说,Spring 框架负责对象的创建、初始化和管理,开发者只需要关心“菜单”(定义对象的功能),而不需要手动管理对象的生命周期。
在 Spring 中:

你不需要手动创建对象(使用 new 关键字),也不需要手动管理对象的生命周期。
你只需要告诉 Spring 哪些类需要被实例化,它会帮你管理。
Spring 容器(如 ApplicationContext)会负责对象的创建、依赖注入和销毁等管理工作。

例子:

java

public class Car {private Engine engine;// 使用构造器注入来设置依赖public Car(Engine engine) {this.engine = engine;}public void drive() {engine.start();System.out.println("Car is driving...");}
}public class Engine {public void start() {System.out.println("Engine is starting...");}
}

在 Spring 中,Car 类不需要自己去创建 Engine 对象。Spring 会根据配置(如 XML 配置或注解)自动将 Engine 对象注入到 Car 对象中,这就是 依赖注入(DI),这是 IoC 的一种实现方式。
2. AOP(面向切面编程)

AOP 是 Aspect-Oriented Programming 的缩写,意思是面向切面编程。它的核心思想是将程序中的某些通用功能(如日志、事务管理、安全等)抽离出来,放在单独的“切面”中,而不是在每个类中重复编写相同的代码。
通俗解释:

想象一下,你在做饭时,每次做菜都需要记录时间、加调料、清洁厨房等。这些操作和做菜的核心功能(做菜)无关,但每道菜都需要执行这些“附加操作”。传统的做法是,你每次做菜时都要重复这些附加操作。

而 AOP 就是你把这些附加操作(比如记录时间、清理厨房)抽象成“切面”,并在做菜的过程中自动插入这些操作,无需每次手动做。
在 Spring 中:

AOP 允许你将横切关注点(比如日志记录、事务管理、安全控制)从业务逻辑中分离出来,并通过切面来统一处理。你只需要定义切面,Spring 会在适当的时候自动插入这些切面功能。
AOP 的基本概念:

切面(Aspect):横切关注点的模块化。比如,日志记录、事务管理等。
连接点(Joinpoint):程序执行过程中可以插入切面的点,比如方法调用、字段访问等。
通知(Advice):切面在特定连接点执行的代码,通知的类型可以是“前置通知”、“后置通知”等。
切入点(Pointcut):定义了在哪些连接点插入切面的条件。通过切入点,你可以指定在哪些方法上执行通知。
织入(Weaving):将切面代码与目标对象的代码结合的过程。

例子:

java

@Aspect
@Component
public class LoggingAspect {// 定义一个切入点:所有 public 方法执行前都会触发这个切面@Before("execution(public * com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}
}

在上面的例子中,LoggingAspect 是一个切面,它在 com.example.service 包中所有公共方法执行前打印日志。这种行为不需要在每个服务类中重复写,只需要在一个地方定义切面即可。
总结:

IoC:Spring 负责管理对象的创建、初始化、销毁等生命周期。你不需要手动管理对象,Spring 会帮你做。
AOP:Spring 通过切面将通用的业务逻辑(如日志、事务)从核心业务逻辑中抽离出来,使得代码更加清晰、可维护,并避免重复编写同样的逻辑。

两者结合使用,可以极大提高代码的松耦合性和可维护性。

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

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

相关文章

去哪儿大数据面试题及参考答案

Hadoop 工作原理是什么? Hadoop 是一个开源的分布式计算框架,主要由 HDFS(Hadoop 分布式文件系统)和 MapReduce 计算模型两部分组成 。 HDFS 工作原理 HDFS 采用主从架构,有一个 NameNode 和多个 DataNode。NameNode 负…

守护进程

目录 守护进程 前台进程 后台进程 session(进程会话) 前台任务和后台任务比较好 本质 绘画和终端都关掉了,那些任务仍然在 bash也退了,然后就托孤了 ​编辑 守护进程化---不想受到任何用户登陆和注销的影响​编辑 如何…

element ui select绑定的值是对象的属性时,显示异常.

需要声明 value-key"value". el-select v-model"value" clearable placeholder"Select" value-key"value" style"width: 240px"><!-- <el-option v-for"item in options" :key"item.value" :…

SAAS美容美发系统架构解析

随着技术的不断发展&#xff0c;SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;模式在各个行业的应用逐渐深化&#xff0c;美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程&#xff0c;而随着SAAS平台的出现&…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

Java学习笔记--继承方法的重写介绍,重写方法的注意事项,方法重写的使用场景,super和this

目录 一&#xff0c;方法的重写 二&#xff0c;重写方法的注意事项 三&#xff0c;方法重写的使用场景 四&#xff0c;super和this 1.继承中构造方法的特点 2.super和this的具体使用 super的具体使用 this的具体使用 一&#xff0c;方法的重写 1.概述:子类中有一个和父类…

gRPC 双向流(Bidirectional Streaming RPC)的使用方法

gRPC 是一个支持多种语言的高性能 RPC 框架&#xff0c;拥有丰富的 API 来简化服务端和客户端的开发过程。gRPC 支持四种 RPC 类型&#xff1a;Unary RPC、Server Streaming RPC、Client Streaming RPC 和 Bidirectional Streaming RPC。下面是双向流 API 的使用方法。 双向流…

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

【ComfyUI】前景分割ComfyUI-BiRefNet-Hugo (无法选定分割的主体,背景鉴别由模型数据,也叫二分分割,显著性分割)

源码&#xff1a;https://github.com/ZhengPeng7/BiRefNet comfyui插件&#xff1a;https://github.com/MoonHugo/ComfyUI-BiRefNet-Hugo 模型下载地址&#xff1a;https://huggingface.co/ZhengPeng7/BiRefNet 工作流以及相关资源下载&#xff1a;https://pan.baidu.com/s/1-U…

大数据技术之Spark :我快呀~

在 MapReduce 为海量数据的计算服务多年后&#xff0c;随着时代的发展和 Spark 等新技术的出现&#xff0c;它的劣势也慢慢的凸显出来了&#xff1a; 执行速度慢。编程复杂度过高。 先看第一点 2000 年代诞生的 MapReduce &#xff0c;因为计算资源有限&#xff0c;所以 Map…

新160个crackme - 105-royalaccezzcrackme

运行分析 需破解Name和Serial&#xff0c;点击OK没反应 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到关键字符串 进行静态分析&#xff0c;逻辑如下&#xff1a;1、Name长度大于4&#xff0c;小于212、fun_1返回值为1 对func_1进行动态调试分…

【RISC-V CPU 专栏 -- 香山处理器介绍】

文章目录 RISC-V 香山处理器介绍雁栖湖处理器南湖处理器RISC-V 香山处理器介绍 相信很多小伙伴对于“香山”都不陌生,它是一款开源RISC-V处理器核,香山的每一代架构,都是采用了湖的名字,第一代架构被命名为雁栖湖,第二代架构则叫做 “南湖”。 “雁栖湖”这款处理器的 R…

远程视频验证如何改变商业安全

如今&#xff0c;商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力&#xff0c;但…

【TQ2440】02 串口连接进入u-boot

需要收到的板子已经烧写好系统或u-boot&#xff0c;看开机液晶屏底下的四个LED灯有没有亮黄绿色&#xff0c;没有就是还没烧写u-boot&#xff0c;需要先使用Jlink烧写u-boot 进入 uboot 的下载模式&#xff0c;如果从 Nor Flash 启动默认的就是进入 uboot 的下载模式&#xff…

QCommandLinkButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

【Vue】Ego商城项目跟做

技术栈 Vue全家桶&#xff1a;Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求&#xff1a;npm install --save axios --no-fund Element&#xff1a;vue add element 后端相关依赖&#xff1a;npm install --save express cors mysql --no-fund token&#xff1a;np…

python简单算法

冒泡 def boll(lis):i 0while i<len(lis)-1:j 0while j<len(lis)-1-i:if lis[j] > lis[j1]:lis[j],lis[j 1] lis[j1],lis[j]j1i1选择排序 def selct1(lit):i 0while i<len(lit)-1:j i1min1 iwhile j < len(lit):if lit[j] < lit[min1]:min1 jj 1li…

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…

【Docker】常用命令汇总

Docker 是1个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…

如何选择最适合企业的ETL解决方案?

在今天的大数据时代&#xff0c;企业的数据管理和处理变得愈发重要。企业也越来越依赖于数据仓库和数据湖来提取、转换和加载&#xff08;ETL&#xff09;关键业务信息。一个高效、灵活的ETL解决方案不仅能提升数据处理能力&#xff0c;还能为企业决策提供有力支持。然而&#…