什么是Spring

文章目录

  • 什么是Spring
    • 什么是 IoC
  • Spring的IoC
    • DI的概念

什么是Spring

Spring 是一个包含了众多工具方法的 IoC容器

什么是 IoC

Inversion of Control — 控制反转

在传统的开发中,假设A类依赖于B类,那么创建A对象实例就需要先new一个B类对象,也就是说A对象掌握着B对象的控制权。当实例B类时传入了不同的参数那么A类对象也会跟着改变。假设现在A类不想掌握B类的控制权,将控制权交出去,A类只需要拿到B类对象不关心是谁给的,从而完成解耦,这个过程就是IoC 过程。

以传统方法写一个造车的程序为例,首先 车需要依赖车身,车身需要依赖底盘,底盘需要依赖轮胎。那么使用代码编写出来的就需要实例构造车类前需要构造车身类,构造车身类就需要先构造底盘类,构造底盘类就需要构造轮胎类。

package IoC;public class Car {private Framework framework;public Car(){framework = new Framework();}public void init(){System.out.println("do car");framework.init();}public static void main(String[] args) {Car car = new Car();car.init();}
}
class Framework {private Bottom bottom;public Framework(){bottom = new Bottom();}public void init(){System.out.println("do framework");bottom.init();}
}class Bottom {private Tire tire;public Bottom(){tire = new Tire();}public void init(){System.out.println("do Bottom");tire.init();}
}class Tire{private int size = 22;public void init(){System.out.println("size -> " + size);}
}

image-20240124223405201

传统的开发逻辑顺序就如上所示,这种代码是非常有缺陷的,例如轮胎的尺⼨固定,并不符合实际的需要。而改为 IoC 后:

package IoC;public class Car {private Framework framework;public Car(Framework framework){this.framework = framework;}public void init(){System.out.println("do car");framework.init();}public static void main(String[] args) {Tire tire = new Tire(22);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.init();}
}
class Framework {private Bottom bottom;public Framework(Bottom bottom){this.bottom = bottom;}public void init(){System.out.println("do framework");bottom.init();}
}class Bottom {private Tire tire;public Bottom(Tire tire){this.tire = tire;}public void init(){System.out.println("do Bottom");tire.init();}
}class Tire{private int size;public Tire(int size){this.size = size;}public void init(){System.out.println("size -> " + size);}
}

代码经过以上调整,无论底层类如何变化,整个调用链是不用做任何改变的,把创建子类的方式,改为注入传递的方式从而实现代码之间的解耦。这种把下级对象注入当前对象中,下级的控制权不再由上级类控制的思想就是 IoC实现思想。

Spring的IoC

首先Spring是一个 IoC容器,既然是个容器那么Spring具备将**对象存入和取出对象这两个核心基础功能。**也就是说学 Spring 最核心的功能,就是学如何将对象存入到 Spring 中,再从 Spring 中获取对象的过程

这样的好处是:将对象存储在 IoC 容器相当于将以后可能用的所有工具制作好都放到仓库中,需要的时候直接取,用完再把它放回到仓库。就不需要每次都现做,用完就丢掉下次需要还得重新做。这也就是 IoC容器和普通程序的区别

因此Spring是一个 IoC 容器说的就是:对象的创建和销毁的权利都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力

DI的概念

Dependency Injection — 依赖注入

所谓依赖注⼊,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中

IoC容器就是利用依赖注入的方式去实现对象之间的解耦

IoC 是“目标”也是⼀种思想,而目标和思想只是⼀种指导原则,最终还是要有可行的落地方案,而 DI 就属于具体的实现

上面所写的 IoC代码属于是一种被动的传递,需要别人去传才能够获取。而在Spring中就可以不需要别人传,自己就可以主动的获取到,这种就是 DI 也就是依赖注入

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

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

相关文章

分享本机搭建《幻兽帕鲁》服务,并可以外网联机的方法

由于《幻兽帕鲁》玩家好评率也高达93%,天卖出600万份,爆火游戏幻兽帕鲁最高180万人同时在线,直接登顶,也有不少玩家从中体会到了难得的“当老板”的乐趣。官方虽然支持联机人数更多,但是由于游戏过于火爆,服…

瑞_力扣LeetCode_101. 对称二叉树

文章目录 题目 101. 对称二叉树题解方式一 递归方式二 迭代 🙊 前言:本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列,主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用,禁止用于商业用途&#xff0c…

代码随想录算法训练营第十六天| 104.二叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

104.二叉树的最大深度 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 ●二叉树节点的深度:指从根节点到该节点的最长简单路径边…

Java Web(四)--JavaScript

介绍 JavaScript 教程 JavaScript 能改变 HTML 内容,能改变 HTML 属性,能改变 HTML 样式 (CSS),能完成页面的数据验证; JS 需要运行浏览器来解析执行JavaScript 代码; JS 是 Netscape 网景公司的产品&#xf…

深入了解Figure的结构与层次

深入了解Figure的结构与层次 一 Matplotlib中的Figure1.1 Figure的概念和作用:1.2.创建Figure对象:1.3 Figure的属性和方法: 二 子图(Axes)的角色与创建2.1 子图(Axes)的概念:2.2 创建子图的方法:2.3 Axes的…

使用visual studio写一个简单的c语言程序

官网下载visual studio,社区版免费的 https://visualstudio.microsoft.com/zh-hans/ 下载好以后选择自己的需求进行安装,我选择了两个,剩下的是默认。 创建文件:

嵌入式面试提问

嵌入式面试问题 1.讲一下STM32的时钟系统 现总结下:首先是时钟源输入时钟信号到单片机,然后单片机对输入的时钟信号进行倍频和分频处理,再将处理后的时钟信号输出至系统,外设或外部接口。   先看这张图,最外面的线上…

第三篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:添加页面和页面路由

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、编写第一个页面Index.ets 示例代码三、编写第二个页面Second.ets示例代码四、第一个页面Index.ets 跳转到第二个页面Second.ets 示例代码五、第二个页面Scond.ets返回第一个页面In…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法,全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果,是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…

HTML标签(二)

目录 表格标签 表格的主要作用 表格的具体用法 表头单元格标签 表格属性 表格结构标签 合并单元格 合并单元格的方式: 跨行合并: 跨列合并: 列表标签 无序列表 有序列表 自定义列表 表单标签 表单域 表单域的常用属性 表单元素…

如何使用labelme上次的标记结果继续制作图像的标签

众所周知,labelme 软件可以对图像进行标签的制作,本文就来讲解一下如何根据labelme上次的标记结果,继续对图像的标签进行制作。 首先,确保创建的虚拟环境中已经安装了labelme软件,关于labelme的安装在此我就不赘述了&…

[极客大挑战 2019]LoveSQL1

万能密码测试,发现注入点 注意这里#要使用url编码才能正常注入 测试列数,得三列 查看table,一个是geekuser另一个是l0ve1ysq1 查看column,有id,username,password,全部打印出来,…

【医学图像数据增强】切割-拼接(CS-DA)

切割-拼接CS-DA CS-DA 核心思想自然图像和医学图像之间的关键差异CS-DA 步骤确定增强后的数据数量 代码复现 CS-DA 核心思想 论文链接:https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf 大多数用于医学分割的数据增强技术最初是在自然图像上开发的&#x…

如何实现动态代理(俩种方式)

文章目录 基于接口的动态代理:基于类的动态代理: 基于接口的动态代理: 通过Java的反射机制来动态创建代理对象,代理对象实现了一个或多个接口。 Java提供了java.lang.reflect包中的Proxy类和InvocationHandler接口来实现基于接口…

ORM-06-jooq 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.(手写简易版 mybatis) JOOQ JOOQ 可以通过数据库直接生成 java 代码,通过 flent-api 进行数据库操作。 SQL builder JOOQ 非常的灵活和强大。你可…

加载服务端发送的模型文件_unity开发进阶

加载服务端发送的模型文件 前言一、服务端搭建二、unity请求文件三、加载模型结语 前言 之前我们学习制作的都是离线状态下的东西,今天我们学习制作一个小demo。 内容就是我们用unity请求后台,接受后台发送过来的模型,然后将模型加载到场景中…

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

k8s---安全机制

k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。安全机制的核心&#xff1a;APIserver。为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的机制都是围绕apiserver来进行设计&#xff1a; 请求api资源&#xff1a; 1、认证 2、鉴权 …

快速上手的AI工具-文心一言绘本创作

前言 大家好晚上好&#xff0c;现在AI技术的发展&#xff0c;它已经渗透到我们生活的各个层面。对于普通人来说&#xff0c;理解并有效利用AI技术不仅能增强个人竞争力&#xff0c;还能在日常生活中带来便利。无论是提高工作效率&#xff0c;还是优化日常任务&#xff0c;AI工具…

js计算皮尔逊相关系数

代码如下; let XGX {correlationCoefficient(pA, pB) {let covXY -pA * pBlet varX pA * (1-pA) let varY (1-pB)* pBlet res covXY / (Math.sqrt(varX*varY, 2))return res},correlation(x,y){x[0.3,50.2,99.5,199.3,299,398];y[0.1,50,99.9,200,300,400];// 计算均值con…