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

Spring核心:探索IoC容器与依赖注入的奥秘

目录

一、什么是Spring?

二、什么是 Ioc ?

2.1 控制反转的实现方式

2.1.1 依赖注入

2.1.2 依赖查找

2.1.3 优点分析

2.2 理解 Ioc


一、什么是Spring?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是个开源框架,有着活跃的社区,这就是它之所以能久经不衰的原因。用一句话进行概括:Spring是包含了众多工具方法的 loC 容器。那什么是 loC 容器呢?🧐🧐🧐

二、什么是 Ioc ?

IoC(Inversion of Control,控制反转)英文翻译即 “控制反转” 的意思,是 Spring框架的核心概念之一, 它是一种设计原则和编程思想(设计思想),用于实现松耦合和可测试的应用程序。在传统的编程模式中,对象之间的创建、组装和管理是通过开发人员手动完成的,而在 loC模式下,则是通过一个容器来进行管理。

2.1 控制反转的实现方式

2.1.1 依赖注入

依赖注入loC 的一种具体的实现方式,通过将依赖关系注入到对象中,实现对象之间的松耦合容器负责查找依赖对象,并将其自动注入到相应的对象中。依赖注入可以通过构造函数Setter方法接口注入来完成。依赖注入的优点是减少对象之间的耦合,使代码更加灵活和可维护。

2.1.2 依赖查找

依赖查找是另一种 loC 的实现方式,它通过容器提供的API,开发人员手动查找并获取所需要的依赖对象,而不是将依赖关系委托给容器。通过容器提供的接口来获取所需要的对象实例,从而实现对象之间的解耦。

2.1.3 优点分析

loC 是Spring框架的基石,使用 loC 的好处在于:

  • 降低代码之间的耦合度

  • 可维护性更好,对象更易于扩展和重用

  • loC 容器管理对象,简化开发的难度,节省开发时间。

2.2 理解 Ioc

假如我们需要构造一辆汽车,思路如下:车需要依赖车身(FrameWork Class),车身需要依赖底盘(Bottom Class), 底盘需要依赖轮胎(Tire Class)

最终程序的实现代码如下:

//轮胎类
public class Tire {//车轮大小为:10public int size=30;public void init(){System.out.println("size="+size);}
}
//底盘类:依赖轮胎
public class Bottom{public void init(){Tire tire=new Tire();System.out.println("size="+tire.size);}
}
//车身类,依赖底盘
public class FrameWork {public void init(){Bottom bottom=new Bottom();bottom.init();}
}
//汽车类,依赖车身
public class Car {public void init(){FrameWork frameWork=new FrameWork();frameWork.init();}
}
//测试程序:输入轮胎的大小
public class Test {public static void main(String[] args) {Car car=new Car();car.init();}
}

程序输出结果如下:

以上程序中,轮胎的尺寸是固定的,然而随着对汽车的需求量越来越高,个性化需求也会越来越多,这时候我们就需要加多种尺寸的轮胎,那这个时候就要对上面的程序进行修改了,修改后的代码如下所示:

public class Tire {//车轮大小为:10public int size=30;public void init(){System.out.println("size="+size);}//添加带参构造方法:方便对轮胎的大小进行设置public Tire(int size){this.size=size;}
}

public class Bottom{public void init(int size){Tire tire=new Tire(size);System.out.println("size="+tire.size);}
}

修改后代码如下:

public class Tire {//车轮大小为:10public int size=30;public void init(){System.out.println("size="+size);}public Tire(int size){this.size=size;}
}
//底盘类依赖轮胎public class Bottom{public void init(int size){Tire tire=new Tire(size);System.out.println("size="+tire.size);}
}
//车身类依赖底盘public class FrameWork {public void init(int size){Bottom bottom=new Bottom();bottom.init(size);}
}
//汽车类依赖车身public class Car {public void init(int size){FrameWork frameWork=new FrameWork();frameWork.init(size);}
}
//测试类代码public class Test {public static void main(String[] args) {//首先创建上级类对象Car car=new Car();car.init(30);}
}

 以上程序的问题是:当最底层代码改动之后,整个调用链上的所有代码都需要修改(强耦合)。

解决方案:

public class Tire {//车轮大小为:10public int size=30;public void init(){System.out.println("size="+size);}public Tire(int size){this.size=size;}
}public class Bottom{private Tire tire;public Bottom(Tire tire){this.tire=tire;}public void init(){tire.init();}
}public class FrameWork {private Bottom bottom;public FrameWork(Bottom bottom){this.bottom=bottom;}public void init(){bottom.init();}
}public class Car {private FrameWork frameWork;public Car(FrameWork frameWork){this.frameWork=frameWork;}public void init(){frameWork.init();}
}/*
模拟实现 loC容器:控制对象*/public class Test {public static void main(String[] args) {Tire tire=new Tire(100);Bottom bottom=new Bottom(tire);FrameWork frameWork=new FrameWork(bottom);Car car=new Car(frameWork);car.init();}
}

 

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

在上面的程序中,我们发现了一个规律:通用程序的实现代码,类的创建顺序是反的。改进后的控制权发生反转后,不再是上级对象创建并控制下级对象了,而是下级对象通过注入到当前对象,下级的控制权不再由上级类控制。即使下级类发生任何变化,当前类都是不受影响的,这就是 loC 的设计思想。

相关文章:

Spring核心:探索IoC容器与依赖注入的奥秘

目录 一、什么是Spring? 二、什么是 Ioc ? 2.1 控制反转的实现方式 2.1.1 依赖注入 2.1.2 依赖查找 2.1.3 优点分析 2.2 理解 Ioc 一、什么是Spring? 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架&#xff…...

15分钟学 Go 实践项目二:打造博客系统

打造博客系统 项目概述 在本项目中,我们将创建一个简单的博客系统,重点实现CRUD(创建、读取、更新、删除)操作和用户管理。这个博客系统将使用户能够发布文章,评论,并管理其个人账户信息。 目标 实现用…...

Follow软件的使用入门教程

开篇 看到很多兄弟还不知道怎么用这个当下爆火的浏览器!在这里简单给需要入门的小伙伴一些建议: 介绍 简单解释一下,RSS 意思是简易信息聚合,用户可以通过 RSS 阅读器或聚合工具自主订阅并浏览各个平台的内容源,不用…...

【IC验证】systemverilog的设计特性

systemverilog的设计特性 一.概述二.面向硬件的过程语句块1.说明2.always_comb2.always_latch3.always_ff 三.关系运算符1.说明2.例子 四.inside判定符1.说明2.例子 五.条件分支语句(1)说明(2)例子(case和unique case的…...

【点击劫持漏洞(附测试代码)】

漏洞描述 点击劫持(Clickjacking)是一种网络攻击技术,攻击者通过将一个恶意的页面或按钮隐藏在合法网站的页面下,诱使用户在不知情的情况下点击隐藏的内容,从而触发攻击者设计的操作。这种攻击通常会导致用户无意中执…...

【AD】3-4 在原理图中放置元件

1.打开原理图库,选中元件点击放置 2.点击工程右键,选择,,进行编译,点击Components,选中鼠标点击拖动即可...

协程2 --- 相关概念

文章目录 协程切换方案协程库的完善程度协程栈方案协程调度实现有栈协程与无栈协程对称协程与非对称协程 协程切换方案 具体使用和解析看栈切换那个博客 使用setjump、longjump c语言提供的方案 可参考:libmill 使用操作系统提供的api:ucontext、fiber …...

Hadoop-005-HDFS分布式文件存储原理

一、HDFS数据如何存储 分布式存储:每个服务器(节点)存储文件的一部分, 本文提到的part只是为方便理解, 指的文件部分数据, 并不是真实存在的概念 #mermaid-svg-qjJMG6r2bzRNcWkF {font-family:"trebuchet ms",verdana,arial,sans-s…...

【多线程入门篇】 创建线程以及线程的属性

大家好呀 我是浪前 今天给大家讲解的是创建线程以及线程的属性 祝愿所有点赞关注的人,身体健康,一夜暴富,升职加薪迎娶白富美!!! 点我领取迎娶白富美大礼包 🍓多线程编程: 前言: 我们为什么不用多进程?…...

三十四、Python基础语法(文件操作-上)

一、介绍 文件:可以储存在长期储存设备上的一段数据,在计算机储存的数据都是二进制的形式储存的,我们用软件打开文件不是看见0和1是因为软件会自动将二进制数据进行转换。 二、文件操作 1.打开文件 打开文件:文件是在硬盘中储…...

【大咖云集,院士出席 | ACM独立出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17日)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 官方信息 会议官网:www.icbar.net 2024 4th International Conference on Big Data, Art…...

03 Oracle进程秘籍:深度解析Oracle后台进程体系

文章目录 Oracle进程秘籍:深度解析Oracle后台进程体系一、Oracle后台进程概览1.1 DBWn(Database Writer Process)1.2 LGWR(Log Writer Process)1.3 SMON(System Monitor Process)1.4 PMON&#…...

AndroidStudio通过Bundle进行数据传递

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:AndroidStudio 目录 1.新建活动 2.修改页面布局 代码: 效果: 3.新建类ResultActivity并继承AppCompatActivity 4.新建布局文件activity_result.xml 代…...

Linux篇(文件管理命令)

目录 一、Linux下文件命名规则 1. 可以使用哪些字符 2. 文件名的长度 3. 文件名的大小写 4. Linux文件扩展名 二、目录创建与删除 1. 目录创建 1.1. mkdir创建目录 1.2. mkdir -p 递归创建目录 1.3. 使用mkdir同时创建多个目录 2. 目录删除(必须是空目录&…...

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据存储分区的艺术与实践(下)(2/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【数据结构】B树

B树(B-Tree)是一种自平衡的多叉搜索树,广泛应用于数据库系统和文件系统中,以便高效地进行数据存储和检索。它的设计目标是减少磁盘I/O操作,使得在大量数据的情况下依然能够进行快速的查找、插入和删除操作。 B树的特点…...

Docker 容器网络模式详解

Docker 容器网络模式详解 1.1 引言 1.1.1 Docker 网络简介 Docker 是一个开源的应用容器引擎,它允许开发者将应用和依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器采用沙箱机制,彼此…...

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第四周 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)4.11 一维到三维推广(1D and 3…...

小游戏开发,出现了降本增效的技术?

中国经济下行大周期下,要说受影响程度较小的,非游戏行业莫属了。 小游戏的快速增长主要得益于其便捷的使用方式和轻量化的特点。小游戏通常无需下载,即点即玩,适合在碎片时间内进行娱乐,这种特性吸引了大量用户。此外…...

(4)Java 编程基础概览:Java中的输入输出操作与代码注释详解

目录 1. 控制台输出操作2. 控制台输入操作代码解释:3. 代码注释3.1 单行注释3.2 多行注释3.3 文档注释3.4 注释的重要性3.5 注意事项在Java编程语言中,输入与输出(I/O)操作扮演着举足轻重的角色。它们允许程序与外界环境进行数据的交互,无论是从用户处获取信息,还是向用户…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...