初识Spring - 什么是IoC容器?

目录

一、Spring是什么?

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

 2. IoC的优点 (解决耦合问题)

二、什么是Spring IoC

1. Spring IoC详解

(1)也就是学习 Spring 最核心的功能:

(2)将对象存放到容器中的好处:

(3)为什么Spring是一个IoC容器:

2. 什么是DI(Dependency Injection)


前言

     从这篇文章开始进入EE进阶的学习,内容就是学习一些企业主流的框架,首先学习框架的意义就在于可以高效的开发项目,高效就是框架最大的优势,框架也是更易用的。首先来说EE初阶学习的 servlet 其实和主流的 Spring-Boot 框架相比是有很多的不方便的地方:

1. 添加外部jar包不方便,必须要外部的jar包版本是匹配的

2. 运行和调试需要配置tomcat

3. 发布 servlet 项目需要依靠tomcat(外置web容器)运行
4. 路由配置不方便,一个访问地址对应一个 Servlet 类等等

    但是如果是一个Spring-Boot项目,此时就没有servlet的痛点。所以,学习如何高效的做出项目是很有必要的。

一、Spring是什么?

    Spring值得是 Spring Framework(Spring框架),它是开源的框架,支持广泛的应用场景,可以让Java企业的应用程序开发更简单高效。

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

容器  就是用来容纳物品的一个装置。在之前的文章中也有提到,向Java集合框架中的List,Map,这就是存储数据的一个容器,还有Tomcat就Web容器。
IoC (Inversion of Control)我们需要把它翻译成 ”控制权的反转“ 的一个容器,我们可以用一个场景来解释什么是控制权的反转:有一个A对象和B对象,此时如果要使用B对象,要依赖B对象才可以使用,所以此时就需要在A对象中 new 一个B对象,也就是说 A对象控制着B对象的生命周期,用到了就去创建它,不用了就把它销毁

    但是此时如果在代码层次就有很大的问题:耦合,所谓的耦合就是A对象依赖B对象才能使用,如果B对象的构造方法改了,或者是加了参数,或者是减少了参数,此时A对象也要跟着B对象一起改变,此时的代码就称为 "高耦合"。  但是开发要求的代码是 "高内聚,低耦合"的,不能是一个代码模块改变之后,其他调用链上的代码都要跟着一起改变。

    控制权的反转的意思就是A对象不控制B对象的生命周期了,在使用A对象的时候只是给A对象传一个类似参数的东西(B对象),至于B对象的控制权交给哪个对象来控制,此时A是不关心的,所以此时就发生了一个控制(权)的反转,如下图:

 2. IoC的优点 (解决耦合问题)

    如果现在需要在程序中造一辆车,首先就有一个车身,地盘,轮胎,所以造车的时候,车是依赖于车身的,车身又依赖于地盘,此时依赖关系,如下代码:

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

    此时的轮胎的size是固定大小的,但是我如果需要一个别的尺寸的轮胎就需要在init方法中传一个size的参数,如下代码:

     但是在init方法中传入一个参数之后,此时有依赖关系的调用链中的所有的代码都有问题了,都需要改这个参数, Tire类的init方法中有了参数,Bottom类中就需要传一个参数,Bottom类中传了参数之后,Framework类中又有问题了......

     但是如果是控制权反转了,不再在car类中控制framework的生命周期,只是在需要使用的时候传这样的一个参数,此时就不会再出现耦合的现象了,如下代码:

     所以从上述代码来看:

传统的 new 对象的方式创建顺序: Car  -->  Framework  -->  Bottom -->  Tire 

IoC类的创建顺序:Tire  -->  Bottom --> Framework  -->  Car

    此时就发生了控制权的反转,代码经过上述调整,无论底层咋变化,整个程序调用链是不会做出改变的,这样就完成了代码之间的解耦,从而更加灵活,通用的设计程序了。这也就是IoC实现的思想。

二、什么是Spring IoC

1. Spring IoC详解

    既然Spring是一个IoC(控制反转)容器,重点还在 容器 身上,只要它是一个容器,此时就又两个最基本的功能:

1. 将对象存入到容器中
2. 从容器中取出对象使用

(1)也就是学习 Spring 最核心的功能:

     学习如何 将对象存到Spring中,再从Spring中获取对象的过程。

(2)将对象存放到容器中的好处:

     将对象存储在IoC容器中相当于将以后可能用到的所有工具制作好放到仓库中,需要的时候直接取即可,用完再将对象放回i仓库中,而 new 对象的方式就相当于每次需要工具的时候才开始做,用完了就扔掉,也不会进行保存,下次再使用的时候还得重新做。

这就是IoC容器和普通开发程序的区别。

(3)为什么Spring是一个IoC容器:

     指的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。

2. 什么是DI(Dependency Injection)

    DI 翻译成中文就是 "依赖注入" 的意思,所谓依赖注入就是 IoC 的一种具体的实现方式,就是由IoC容器在运行期间,动态将某种依赖关系注入到对象中,也就是指通过引入IoC容器,利用依赖关系注入的方式,来实现对象和对象之间的解耦。(IoC是一种思想,而DI就属于具体的实现方式)

    而具体是如何在代码层次实现的 DI 会在下一篇文章 Spring 的创建和使用中详解。

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

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

相关文章

剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格 文章目录 剑指 Offer 05. 替换空格一.题目描述二.代码(快慢指针-中间指针和末尾指针) 一.题目描述 二.代码(快慢指针-中间指针和末尾指针) class Solution {public:string replaceSpace(string s) {char ch ;int count std::count(s.begin(), s.end…

Vim语法

Vim语法及插件 常用Normal模式移动删除修改查找复制粘贴撤销 Insert模式复制粘贴 CMD模式替换 Visual模式多文件间的转换BufferWindowTab 文本对象宏补全 常用 课程链接 Vim中的指令可以灵活组合使用 :help 查找文档 切换为后台Ctrl z;切换为前台fg Ctrl D打…

持之以恒,安之有度 | 持安科技2周年!

新征程 新未来 持安的同学们已经一起走进 第三个年头啦 近日,持安 北京 上海 深圳 所有公司成员齐聚一堂 共 同 庆 祝 持安科技 成立2周年 持安一体化零信任平台 ,引领应用层零信任落地新局面 2021年,何艺(持安创始人兼CE…

数据结构初阶--排序2

目录 前言快速排序思路hoare版本代码实现挖坑法代码实现前后指针法代码实现 快排优化三项取中法代码实现三指针代码实现 快排非递归代码实现 归并排序思路代码实现归并非递归代码实现 计数排序思路代码实现 前言 本篇文章将继续介绍快排,归并等排序算法以及其变式。…

Git常用命令及在Idea中如何使用创建分支等,详讲带图[保姆级]

文章目录 Git在Git命令行中执行下面命令:设置基本信息获取Git仓库Git 工作区 暂存区 版本库概念工作状态远程仓库操作分支操作标签分类 Idea中使用推送到远程仓库(提交并且推送)分支操作 Git 在Git命令行中执行下面命令: 设置基本信息 设置用户信息 git config --global use…

Transformer原理理解

本文介绍Transformer的基本原理,主要记录一下自己的学习过程。 论文:https://arxiv.org/abs/1706.03762 参考: http://jalammar.github.io/illustrated-transformer/https://zhuanlan.zhihu.com/p/338817680https://blog.csdn.net/longxinc…

复习第四课 C语言-分支语句和循环

目录 【1】字符输入输出 【2】C语言下的垃圾字符回收 【3】分支语句 【4】循环 练习: 【1】字符输入输出 按字符的输入输出 int getchar(void); 功能:从终端输入一个字符 参数:无 返回值:输入字符的ASCII值int putchar(int…

使用python get post数据 http https

0、目的 目的比较简单,测试,使用python来提交数据是非常简洁的,修改代码也容易,除了做人工智能,本身也是一个非常好的测试端工具 1、简单的post 一个简单的示例程序,将 headers 内容置为’application/j…

2023华为产品测评官-开发者之声 | 华为云CodeArts征文活动,多重好礼邀您发声!

"2023华为产品测评官-开发者之声"活动激发了众多开发者和技术爱好者的热情,他们纷纷递交了精心编写的产品测评报告。活动社群充满活力,参与者们热衷于交流讨论,互相帮助解决问题,一起探索云技术的无限可能。…

【机器人模拟-02】 模拟移动机器人设置里程计

一、说明 在本教程中,我将向您展示如何设置移动机器人的测程。本教程是“机器人模拟”指南中的第二个教程。测量位移是仿真中的重要内容,设置测程的官方教程在此页面上,但我将逐步引导您完成整个过程。 您可以在此处获取此项目的完整代码。让我们开始吧! 二、ROS 2 中的里程…

最火爆的大模型框架LangChain七大核心及案例剖析上(三)

最火爆的大模型框架LangChain七大核心及案例剖析上 10.6 GPT内容创建者案例详细剖析 我们回到“LangChain GPT内容创建者”案例,一行一行的解析代码,为了更好的看这个代码,先看一下它具体执行的整个日志过程,然后再看一下代码的部分。 首先,在控制台执行脚本,启动web页面…

微信小程序(二)

目录 1、input标签 一、表单绑定 1、数据绑定 2、输入获取 二、网络请求 1、介绍 2、注意 3、使用 4、基于Promise封装 三、自定义组件 1、创建 2、父向子组件通信 3、子向父组件通信 4、生命周期 四、vant weapp组件库 1、配置 2、使用 进入本章前的拓展&#…