Spring的核心与设计思想

news2025/1/17 0:04:56

目录

IoC

传统程序开发思想

传统程序开发的缺陷 

控制反转式程序开发

对比总结

理解Spring IoC

DI

总结


我们通常所说的Spring指的是Spring Framework(Spring 框架),它是一个开源的框架,有着活跃而庞大的社区,Spring支持广泛的应用场景,可以让Java企业级的应用程序开发起来更加简单高效.

一句话概括Spring:Spring是包含了众多工具方法的IoC容器.

理解这句话,我们需要明白什么是IoC,什么是容器.

容器就是用来容纳某种物品的基本装置,我们之前也接触过容器,像List,Map是数据存储的容器,Tomcat就是Web容器.

IoC

IoC = Inversion of Control,控制反转.也就是说Spring是一个控制反转的容器.

我们举一个例子来深刻理解"控制反转":

我们用程序来构建一辆车,汽车依赖于车身,车身依赖于底盘,底盘依赖于轮胎.

传统程序开发思想

传统的思想构建一辆车,我们是从上往下,依靠着彼此之间的依赖关系逐层实现.

代码:

public class NewCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }

    //汽车对象
    static class Car{
        public void init(){
            System.out.println("do car");
            //依赖车身
            Framework framework = new Framework();
            framework.init();
        }
    }

    static class Framework{
        //依赖底盘
        public void init(){
            System.out.println("do framework");
            Bottom bottom = new Bottom();
            bottom.init();
        }
    }

    static class Bottom{
        public void init(){
            //依赖轮胎
            System.out.println("do bottom");
            Tire tire = new Tire();
            tire.init();
        }
    }

    static class Tire{
        //尺寸
        private int size = 17;
        public void init(){
            System.out.println("轮胎尺寸: " + size);
        }

    }

}


传统程序开发的缺陷 

以上程序中,轮胎的尺⼨的固定的,然⽽随着对的⻋的需求量越来越⼤,个性化需求也会越来越多,这 时候我们就需要加⼯多种尺⼨的轮胎,那这个时候就要对上⾯的程序进⾏修改.

public class NewCarUpdateExample {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.run();
    }
    static class Car {
        private Framework framework;
        public Car(int size) {
            framework = new Framework(size);
        }
        public void run() {
            // 依赖⻋身
            System.out.println("do car");
            framework.init();
        }
    }
    static class Framework {
        private Bottom bottom;

        public Framework(int size) {
            bottom = new Bottom(size);
        }

        public void init() {
            // 依赖底盘
            System.out.println("do framework");
            bottom.init();
        }
    }
    static class Bottom {
        private Tire tire;
        public Bottom(int size) {
            tire = new Tire(size);
        }
        public void init() {
            // 依赖轮胎
            System.out.println("do bottom");
            tire.init();
        }
    }
    static class Tire {
        // 尺⼨
        private int size;
        public Tire(int size) {
            this.size = size;
        }
        public void init() {
            System.out.println("轮胎尺⼨:" + size);
        }
    }
}


从上述例子中不难看出传统设计思想设计出来的程序的问题,当最底层的代码改动之后,整个调用链上的所有代码都需要修改.

解决上述问题,我们只需要将原来自己创建的下级类,改为传递注入的方式,因为我们不需要再当前类中创建下级类了,所以即使下级类发生改变,当前类本身也无需修改任何代码,这就实现了程序的解耦.

控制反转式程序开发

把创建子类的方式,改为传递注入的方式.

public class IoCCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(15);
        Bottom bottom =new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }
    static class Car{
        private Framework framework;
        public Car(Framework framework){
            this.framework = framework;
        }
        public void run(){
            System.out.println("do car");
            framework.init();
        }
    }

    static class Framework{
        private Bottom bottom;
        public Framework(Bottom bottom){
            this.bottom = bottom;
        }
        public void init(){
            System.out.println("do framework");
            bottom.init();
        }
    }

    static class Bottom{
        private Tire tire;
        public Bottom(Tire tire){
            this.tire = tire;
        }
        public void init(){
            System.out.println("do bottom");
            tire.init();
        }
    }

    static class Tire{
        private int size = 20;
        public Tire(int size){
            this.size = size;
        }
        public void init(){
            System.out.println("轮胎尺寸: " + size);
        }
    }
}


 

代码经过上述调整之后,无论底层如何变化,整个调用链是用做任何的改变的,这样就完成了代码之间的解耦.


对比总结

传统new对象的方式类的创建顺序:

Car ->Framework->Bottom->Tire

IoC类的创建顺序:

Tire->Bottom->Framework->Car

这就发生了控制权的反转,不再是上级对象创建并控制下级对象了,而是把下级对象注入到当前对象当中,下级的控制权不再是是由上机控制了,这样即使下级类发生变化,上级类都是不受影响的,这就是典型的控制反转,也是IoC的实现思想.

IoC不是一个技术,而是一种思想.


理解Spring IoC

Spring是IoC容器,是一个容器那就意味着它具备着两个最基础的功能:将对象存入容器和从容器中取出对象.

学Spring最核心的功能就是学如何把对象从存入到Spring中,再从Spring中获取对象的过程.

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

将对象放到容器中的好处

将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

Spring IoC的优点

1.解耦

2.使用更加方便(不再需要手动创建,和关注这个对象背后的依赖关系)

3.更加高效


DI

DI是Dependency Injection的缩写,翻译成中文就是"依赖注入"的意思.

依赖注入:由IoC容器在运行期间,动态的将某种依赖关系注入到对象之中.(将依赖的某个对象注入到当前类中的行为就叫做依赖注入)

所以依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.

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

前面所写的IoC控制反转的程序是通过传递的方式实现,这是被动的,DI(依赖注入)这是主动的(主动获取对象).

两种不同的实现技术都可以实现IoC思想,而Spring IoC是一个框架,这个框架的实现是通过DI.


总结

Spring是什么?如何理解Spring?

Spring是一个非常流行的开源框架,核心就是包含了众多工具方法的IoC容器,既然说 是一个IoC容器,就包含了两个最基本的操作,将bean对象存储到容器当中,从容器当中取出bean对象.

IoC和DI是什么?有什么区别?

IoC 控制反转,DI 依赖注入.

IoC和DI是从不同的角度描述的是同一件事情,区别就是IoC是一个思想,DI是具体的实现.

Spring最核心的功能?

IoC容器,IoC容器最基础的操作有两个,存bean取bean.

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

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

相关文章

改进蚁狮优化算法

目录 ​1 主要内容 2 部分程序 3 程序结果 4 程序链接 ​1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型,即原始ALO算法的基础上添加了两种改进策略: - 改进1:将原先的间断性边界收缩因子变为连…

SpringAop 源码解析 (二) - 代理对象的创建以及执行过程

一、SpringAop 代理创建 以及 执行过程 在上篇文章中分析得出在使用 Aop 时,实际向 Spring 容器中注入了一个 AnnotationAwareAspectJAutoProxyCreator 动态代理 bean 生成处理器,该类有实现 BeanPostProcessor 扩展方法,并且在 postProcess…

文心一言 VS chatgpt (7)-- 算法导论2.3 3~4题

三、使用数学归纳法证明:当n刚好是2的幂时,以下递归式的解是 T(n)nlgn。若n2,T(n)2;若n2^k,k>1,T(n)2T(n/2)n。 文心一言: chatgpt: 首先,当 n2 时,T(n)2log₂n2,显…

结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)

我们知道,C语言是允许我们自己来创造类型的,这些类型就叫做——自定义类型。 自定义类型又包括结构体类型,联合体类型还有枚举类型。 今天的文章,我们就着重讲解这其中的结构体类型。 目录 结构体的声明 1.1结构的基础知识 …

托福高频真词List01//附阅读真题

once in a whileoccasionally adv 偶尔 🍮segregateseparateV.隔离🍮leftover remainingadj.剩余的 rivalcompetitor rivalcompete n.对手 v.对抗 apparentlyseeminglyadv.显然 🍮unrivaledunequaledadj.无与伦比的 🍮&#x…

TCPIP vs OSI模型:网络通信的两种参考模型有哪些不同?

前言 欢迎来到今天的每日一题,每日一提。昨天聊的是面试中经常会问到tcp协议 。在面试中一旦问到TCP/IP,那么OSI模型肯定是躲不过的。如果直接回答OSI模型有7层,和TCP/IP的区别就是层数不一样。那么恭喜你可以提前回去等通知了。所以今天就聊…

23考研重大软院数一英一391分经验帖

今年这情况之后,所有前人的经验帖作废。 前言: 本校本专业生一战上岸,属于考研界难度最低的一档。 今年有个初试439的怪物,属于是蚌了,第二名也有419,第三名就断档了,我初试第五。 政治78&#…

基于html+css的盒子展示1

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

学习MongoDB这一篇就足够了

这篇博客详细的介绍了MongoDB的安装过程,并配置成了自启动服务,非常方便,亲测有效。 MongoDB的安装配置教程(很详细,你想要的都在这里)http://t.csdn.cn/XWV0B IDEA中 JAVA操作MongoDB: 1. 这篇博客主要介…

计算机操作系统第四版第五章虚拟存储器—课后题答案

1.常规存储器管理方式具有哪两大特征?它对系统性能有何影响? 一次性和驻留性。 一次性及驻留性特征使得许多在程序中不用或暂时不用的程序(数据)占据了大量的内存空间,而一些需要运行的作业又无法装入运行,…

CSDN每日一练:鬼画符门之点点大阵

CSDN每日一练:鬼画符门之点点大阵题目描述题目逻辑老顾的提交CSDN题目特色:阅读理解小结题目描述 题目名称:鬼画符门之点点大阵 时间限制:1000ms 内存限制:256M 题目描述 小艺师从鬼画符门派,由于学艺不精只…

如何解决DNS劫持

随着互联网的不断发展,DNS(域名系统)成为了构建网络基础的重要组成部分。而DNS遭到劫持,成为一种常见的安全问题。那么DNS遭到劫持是什么意思呢?如何解决DNS劫持问题呢?下面就让小编来为您一一解答。 DNS遭到劫持是什么意思? DNS遭到劫持指的是黑客通…

SSM学习记录2:传参(注释方式 + SprigMVC项目 + 2022发布版本IDEA)

SpingMVC传参(一般方式 json方式) 一般方式 package controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBod…

OldWang带你了解MySQL(五)

文章目录🔥MySQL中定义空值🔥MySQL中的别名🔥MySQL中去除重复🔥查询中的行选择🔥MySQL中的比较条件🔥其他比较条件🔥逻辑条件🔥优先规则🔥使用 ORDER BY 排序&#x1f52…

JavaScript【八】JavaScript函数高级

文章目录🌟前言🌟回调函数🌟递归函数🌟闭包🌟什么是闭包函数?🌟 闭包三个特性🌟 闭包的缺点🌟JavaScript的垃圾回收机制🌟闭包小案例🌟局部变量长期驻扎内存…

STM32F407串口通信

本文是基于江科大B站视频编写,参考各种资料进行学习。 1、USART串口协议 硬件电路(接线) 2、USART串口外设 常用波特率为9600、115200 必须对应特定引脚,才能实现通信,如果引脚冲突,看看有没有重…

数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现,其基本过程为: 先根…

计算机网络P5~P7

目录 1.计算机网路性能指标 2.吞吐量 3.时延 4.时延带宽积 5.往返时间 6.利用率 7.丢包率 8.计算机体系结构 1.计算机网路性能指标 速率和带宽 速率 :每秒传输的比特的个数 单位 b/s kb/s mb/s gb/s 带宽:表示传送数据的能力 。带宽可以理解为高…

医院手术麻醉信息管理系统源码

医院手术麻醉信息管理系统源码 实现整个围术期术前、术中、术后的全数字化和信息化。 医院手术麻醉临床信息管理系统是一种基于云计算技术的信息系统,它可以帮助医院更好地管理手术麻醉临床信息,提高手术麻醉的安全性和效率。 首先,医院手术…

数学分析:多元微积分1

卓里奇的数学分析的好处在于直接从多元函数来入手多元微积分,引出矩阵,十分自然。 紧集的概念,感觉直接用闭集去理解就行,(对于图形学来说)。 多元函数的极限,其实和单元函数并没有什么区别。 这…