当前位置: 首页 > news >正文

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 通过切面将通用的业务逻辑(如日志、事务)从核心业务逻辑中抽离出来,使得代码更加清晰、可维护,并避免重复编写同样的逻辑。

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

相关文章:

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

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

电机瞬态分析基础(7):坐标变换(3)αβ0变换,dq0变换

1. 三相静止坐标系与两相静止坐标系的坐标变换―αβ0坐标变换 若上述x、y坐标系在空间静止不动,且x轴与A轴重合,即,如图1所示,则为两相静止坐标系,常称为坐标系,考虑到零轴分量,也称为αβ0坐标…...

Open3D (C++) 生成任意3D椭圆点云

目录 一、算法原理1、几何参数2、数学公式二、代码实现三、结果展示一、算法原理 1、几何参数 在三维空间中,椭圆由以下参数定义: 椭圆中心点 c = ( x 0 , y 0 , z...

5.利用Pandas以及Numpy进行数据清洗

1、缺失值处理 import pandas as pd import numpy as np#创建一张7行5列带有缺失值的表,表中的数据0-100随机生成,索引是python1. df pd.DataFrame(datanp.random.randint(0,100,size(7,5)), index [i for i in pythonl])df.iloc[2,3] Nonedf.iloc[4…...

@Bean注解详细介绍以及应用

目录 一、概念二、应用(一)代码示例1、首先创建一个简单的 Java 类User2、然后创建一个配置类AppConfig3、在其他组件中使用Bean创建的 bean4、通过 Spring 的ApplicationContext来获取UserService并调用其方法 (二)bean的方法名详…...

基于SpringBoot的预制菜销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

从 EXCEL 小白到 EXCEL 高手的成长之路

在职场与日常生活中,Excel 作为一款强大的数据处理与分析工具,扮演着不可或缺的角色。无论是初学者还是资深职场人士,掌握 Excel 技能都能极大地提高工作效率。那么,从一个 Excel 小白蜕变成为 Excel 高手,究竟需要多久…...

【纸飞机串口调试工具】数值显示器及四则运算

目录 纸飞机串口工具介绍软件下载适用场合功能介绍 纸飞机串口工具介绍 纸飞机一款性能强劲且专业的串口/网络/HID调试助手,具有多窗口绘图、关键字高亮、数据分窗和数据过滤等众多功能,可以极大的方便嵌入式开发人员的调试过程。本文介绍数值显示器的四…...

浅谈volatile

volatile有三个特性: (1)可见性 (2)不保证原子性 (3)禁止指令重排 下面我们一一介绍 (一)可见性 volatile的可见性是说共享变量只要修改,就可以被其他线…...

Python3 爬虫 Scrapy的使用

安装完成Scrapy以后&#xff0c;可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为&#xff1a; scrapy startproject <工程名> 例如&#xff0c;创建一个抓取百度的Scrapy项目&#xff0c;可以将命令写为&#xff1a; scrapy s…...

多线程篇-4--重点概念1(volatile,Synchronized,内存屏障,MESI协议)

一、volatile &#xff08;1&#xff09;、简述 volatile是java提供的一个关键字&#xff0c;英文意思为不稳定的。 可以保障被声明对象的可见性和一定程度上的有序性&#xff0c;但不能保证操作的原子性。 当一个变量被声明为volatile时&#xff0c;意味着该变量的值会直接从…...

本地学习axios源码-如何在本地打印axios里面的信息

1. 下载axios到本地 git clone https://github.com/axios/axios.git 2. 下载react项目, 用vite按照提示命令配置一下vite react ts项目 npm create vite my-vue-app --template react 3. 下载koa, 搭建一个axios请求地址的服务端 a.初始化package.json mkdir koa-server…...

1、SpringBoo中Mybatis多数据源动态切换

我们以一个实例来详细说明一下如何在SpringBoot中动态切换MyBatis的数据源。 一、需求 1、用户可以界面新增数据源相关信息,提交后,保存到数据库 2、保存后的数据源需要动态生效,并且可以由用户动态切换选择使用哪个数据源 3、数据库保存了多个数据源的相关记录后,要求…...

【浏览器】缓存与存储

我是目录 浏览器缓存为什么需要浏览器缓存&#xff1f;对浏览器的缓存机制的理解协商缓存和强缓存的区别强缓存协商缓存 点击刷新按钮或者按 F5、按 CtrlF5 &#xff08;强制刷新&#xff09;、地址栏回车有什么区别&#xff1f; 浏览器本地存储前端储存的方式有哪些&#xff1…...

积鼎科技携手西北工业大学动力与能源学院共建复杂多相流仿真联合实验室

11月26日&#xff0c;复杂多相流仿真联合实验室揭牌仪式及技术研讨活动在西北工业大学动力与能源学院成功举办。复杂多相流仿真联合实验室是由西北工业大学动力与能源学院牵头&#xff0c;携手上海积鼎信息科技有限公司与三航铸剑&#xff08;西安&#xff09;科技发展有限公司…...

5. langgraph实现高级RAG (Adaptive RAG)

1. 数据准备 from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chromaurls ["https://lilianweng.github.io/posts/2023-06-23-age…...

Postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这…...

代码随想录day02--链表

移除链表元素 题目 地址&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/description/ 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路是使用虚拟节点的…...

杰发科技AC7803——不同晶振频率时钟的配置

计算公式 PLL_POSDIV [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62] PLL_PREDIV_1 1 2 4 USE_XTAL 24M SYSCLK_FREQ 64M SYSCLK_DIVIDER 1 VCO USE_XTAL*…...

ArcGIS栅格影像裁剪工具

1、前言 在最近的栅格转矢量处理过程中&#xff0c;发现二值化栅格规模太大&#xff0c;3601*3601&#xff0c;并且其中的面元太过细碎&#xff0c;通过arcgis直接栅格转面有将近几十万的要素&#xff0c;拿这样的栅格数据直接运行代码&#xff0c;发现速度很慢还难以执行出来结…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...