【JavaEE进阶】——第二节.Spring核心和设计思想
文章目录
前言
一、Spring是什么?
二、什么是容器?
三、什么是IoC?
3.1 初始loC
3.2 举例解释loC
3.3 Spring IoC思想的体现
四、什么是DI?
4.1DI的概念
4.2 Ioc和DI的区别
总结
前言
今天我们将进入到有关spring的认识当中,要使用它的前提就是要认识并熟悉它,上一节我们介绍了有关maven的配置,必须要配置完成后,才能完成我们后面的学习工作,让我们进入到今天的学习当中吧!!!!!!!!!
一、Spring是什么?
概念:
我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
一句话总结就是:
Spring是包含了众多工具方法的IoC容器;
那么问题来了,工具方法是什么?IoC是什么?容器又是什么?
工具方法我们以后再说,我们先来看看IoC和容器;

二、什么是容器?
容器容器,肯定是要装东西的。其实我们之前学的List还有Tomcat都是容器,为啥这样说呢?
你看List/Map里面放的是不是都是数据,那他不就相当于是一个数据存储容器吗?
还有Tomcat,他里面不是有webapps这个目录,我们之前不都是把servlet项目代码放到webapp这个目录下吗?这个webapps不就是项目的容器吗?而这个webapps目录是Tomcat下面的一个子目录,那么我们把Tomcat称作是一个Web容器,完全没有问题呀!!

三、什么是IoC?
3.1 初始loC
Spring也是一个容器,而且Spring就是一个IoC容器。
那么关键的来了,什么是IoC??
IoC = Inversion of Control 翻译成中文就是控制反转的意思。
也就是说Spring是一个”控制反转“容器。
这个控制反转是什么意思呢?
你看,一般情况下,我们在A类中,想要去调用B类中的方法,是不是需要我们在A类中去实例化B类(new一个B类对象)然后再通过这个实例化出来的对象去调用B类中的方法。
也就是说,当前B类的控制权是再我们A类手中的,但是这样会带来一些问题(如耦合性过高),很多情况下,我们没必要用到谁就实例化谁,我们可以让”其他人“来操作(也能够满足我们的要求,同时这个时候B类的生命周期也与我们A类无关,我们不需要操心那么多,我们只要能拿到我们需要的就好)相当于我们把控制权交给了这个其他人,我们在需要用操作对象时候,让这个”其他人“来帮助我们来管理就好了。
谁调用A,谁就把A需要的B来传给,但B的生命周期与A类无关(这样即使B类发生了变化,A类也不用管)
这个“其他人”,就是 Spring 框架。
此时,我们想要 A 类中调用 B 的时候, 告诉 框架,我要在 A 中 调用 B 了。
至于 B 的生命周期,和我们没有任何关系。这是控制反转。
前面说过: Spring 是一个 控制反转 的 容器。
也就是 像之前在传统开发的时候,所有需要我们自己去new东西,都不需要我们再去new 了。
因为我们把控制权 “反转给了” Spring 框架。
Spring 会帮我们管理所有的对象(Bean);在 Spring 中,我们管 对象,叫做 Bean。
3.2 举例解释loC
下面我们结合一个具体的例子来看看IoC思想有什么好处?
假如,我们现在构建⼀辆“⻋”的程序,我们的实现思路是这样的
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(BottomClass),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:
这样有什么问题呢?
就是当我们的Tire的size需要改变的时候,从上到下,因为Bottom依赖Tire,所以Bottom要对应的改变;同时FrameWork又依赖着Bottom,那么FramWork也要做出对应的改变:同时Car又依赖着FrameWork,所以Car类也要做出必要的改变。
不信你看代码:
这样下来从上到下都有改变,整个代码的耦合性太高了。
为啥会这样呢?
因为每个类中都⾃⼰创建下级类,自己把活都干了。当下级类发⽣改变操作,自己随着也要改变。
但这其实完全是没有必要的
比如我们在Car类中,我们需要的只是一个FrameWork对象,你给我们传一个FrameWork对象不就好了吗,我干嘛还要自己new一个对象呢?(new完后还有摊子事,真是吃力不讨好)
解决方案:
此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦(减少了代码之间的关联性)
代码如下:
从上图也可以看出我们是分别在各自的类中传入了该类所需要的对象,那么对象的创建到达在那里呢?
在另外一个代码,但这个代码其实就和我们整个车的构建是无关的,只是负责构建驱动这个车;
APP类的代码调整:
代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计:
规律总结:
- 在传统的代码中对象创建顺序是: Car -> Framework -> Bottom -> Tire;
- 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car;
我们发现了⼀个规律:传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下
⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想;
3.3 Spring IoC思想的体现
那么Spring的IoC思想体现在哪个地方呢?
本⽂刚开始咱们就讲:Spring 是包含了多个⼯具⽅法的 IoC 容器,这就是对 Spring 最核⼼的总结。“集成多个⼯具⽅法”这事咱们以后慢慢再讲,那如何理解“Spring 是⼀个 IoC容器”这句话呢?
既然Spring是一个IoC(控制反转)的容器,那么重点还在容器这两个字上,那么他就具备两个最基础的功能:
- 将对象存到容器中
- 从容器中取出对象
也就是学Spring最核心的功能,就是学习如何将对象存到Spring当中,在从Spring中获取对象的过程中:
我们一开始就说了IoC就是控制权的转移,在这里我们就是把new对象的操作来交给Spring来做了,我们只用在需要的时候把对象从Spring当中取出来就行,这样我们项目代码本身就不要操心对象事情了,Spring 会帮我们管理所有的对象(Bean)
总结:
Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能力;
使用Spring的好处:
将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

四、什么是DI?
DI全称Dependency Injection,当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入;
4.1DI的概念
说到 IoC 不得不提的⼀个词就是“DI”,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。
dependency,这个词,相信大家并不陌生!
就是我们 在 pom.xml 中 引入依赖的时候,需要用到的标签。

那么依赖注入又是什么呢?
所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同⼀件事情——就是指通过引⼊ IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦;
举例说明:
总结:IoC和DI,在广义上都是一回事!
4.2 Ioc和DI的区别
这个时候就会有一个经典的面试题了——IoC和DI有什么区别?
解析:
IoC是一种思想,DI是一种实现;
举例说明:
假设,我们有一天心情非常好!
决定下班之后,吃顿好的。
这就是一种思想.
但是!我们有说要吃什么吗?
很明显是没有的!
IoC,就是这样的。
我把权限交由 Spring,当我需要使用某个对象的时候,直接向它要。
这哥对象怎么给我的,我不管注!
IoC只关注:是否能拿到这个对象。而 DI 就是一个具体实现:我准备下班去吃海底捞。
此时,吃什么,是不是就明确落实了!
吃海底捞,就是具体的实现。
DI 关注于 怎么将 依赖 注入 对应的对象里面。
总结
1、Spring 是什么?如何理解 Spring?
Spring 是一个包含 众多工具方法 的 IoC 容器。
既然 Spring 是一个 IoC 容器(反转控制容器)。
Spring是 存储 IoC【反转控制(后的对象)】 的一个容器。
2、IoC 和 DI 是什么?有什么区别?
Ioc全称Inversion of Control,把创建对象的权利交给容器,对象的实例不再由调用者来创建,而是由容器来创建,容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移带了容器,控制权发生了反转,这就是控制反转。它是spring框架的核心思想之一。
DI全称Dependency Injection,当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入。
IoC - Inversion Of Control(控制反转)
主要是将 对象的权限(创建与销毁)交由 Spring 来管理。
程序员 不必再去 new 对象了!
在使用到某个对象的时候,直接向 Spring 索取,直接使用即可。
DI - dependency injection(依赖注入)
将 引入的依赖 (执行所依赖的对象),拿过来使用。
区别:
IoC 是一种 思想。
DI 是具体的实现。
3、Spring最核心的功能是什么?
既然 Spring 是一个容器,那么,肯定是具有容器的两个核心功能(存 和 取)。
1、将 Bean(反转的对象)存储到 Spring 容器中。
2、将 Bean(反转的对象)从 Spring 容器中取出来。
这也就是 Spring 的 两个核心功能。
本节内容就介绍到这里,让我们下一期内容再见吧!!!!!!!!!!!

相关文章:
【JavaEE进阶】——第二节.Spring核心和设计思想
文章目录 前言 一、Spring是什么? 二、什么是容器? 三、什么是IoC? 3.1 初始loC 3.2 举例解释loC 3.3 Spring IoC思想的体现 四、什么是DI? 4.1DI的概念 4.2 Ioc和DI的区别 总结 前言 今天我们将进入到有关spring的认识当中&…...
twitter开源算法(1)For You推荐系统架构
1 Twitter’s Recommendation Algorithm 我们的推荐系统由许多互相关联的服务(services)和工作(jobs)组成,本节这要是聚焦home timeline的for you feed流。 the-algorithm开源地址:https://github.com/twitter/the-algorithm 本篇博客来源&…...
A General Framework for Uncertainty Estimation in Deep Learning源码阅读(二)
接上文 ResNet定义: 代码使用 def ResNet18ADF(noise_variance1e-3, min_variance1e-3):return ResNet(BasicBlock, [2,2,2,2], num_classes10, noise_variance1e-3, min_variance1e-3, initialize_msraFalse)定义模型,其中ResNet定义为: …...
串行通信协议---HART协议
实际应用中,HART协议是仅次于Modbus协议的最接近统一现场总线的标准,主要是在4~20mA电流信号上面叠加数字信号,物理层采用Bell 202标准的FSK技术成功实现模拟信号和数字信号双向同时通信而互不干扰。HART协议规定了传输的物理形式、消息结构、…...
【独家】华为OD机试 - 寻找密码(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:寻找密码 题目 小王在进行游…...
FPGA有哪些优质的带源码的IP开源网站?
这是某乎上的一个问题,我觉得还不错,今天就系统性的总结一下1、fpga4funhttps://www.fpga4fun.com/你能在这个网站上找到什么?您可以找到信息页面,以及使用 FPGA 板构建的 FPGA 项目。注重点:项目。FPGA 项目使用一种称…...
基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Postman接口测试之Mock快速入门
一、Mock简介 1.Mock定义 Mock是一种比较特殊的测试技巧,可以在没有依赖项的情况下进行接口或单元测试。通常情况下,Mock与其他方法的区别是,用于模拟代码依赖对象,并允许设置对应的期望值。简单一点来讲,就是Mock创建…...
分享一个国内可用的免费ChatGPT网站
背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个程序员,我也忍不住做了一个基于ChatGPT的网站,免费!免登陆!!国内可直接对话ChatGPT,也…...
15. 三数之和(Java)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 …...
Navicat Premium 16安装教程
1.鼠标右击【Navicat Premium 16(64bit)】压缩包(win11及以上系统需先选择“显示更多选项”)选择【解压到 Navicat Premium 16(64bit)】。 2.打开解压后的文件夹,鼠标右击【setup】选择【以管理员身份运行】。 3.点击【下一步】。 4.选择【我…...
蓝桥杯刷题冲刺 | 倒计时8天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.三角形的面积2.图中点的层次1.三角形的面积 题目 链接: 三角形的面积 - 蓝桥云课 …...
四.JAVA基础面试题:重要知识
四.JAVA基础面试题:重要知识 1.为什么JAVA只有值传递 2.JAVA获取运行时类的四种方式 四.JAVA基础面试题:重要知识 1.为什么JAVA只有值传递 实参:传递给形参的实际参数。 形参:接受实参的参数。值传递:方法接受实参…...
某面试官分享经验:看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上...
我们以前分享过许多经验,但大多是站在打工人的视角上,今天给大家带来一个面试官的经验:1. 看求职者第一眼,开口说第一句话,面试结果就差不多定了,准确率高达90%以上。2. 绝不考八股文,如果问技术…...
Java开发 - 消息队列之RabbitMQ初体验
目录 前言 RabbitMQ 什么是RabbitMQ RabbitMQ特点 安装启动 RabbitMQ和Kafka的消息收发区别 RabbitMQ使用案例 添加依赖 添加配置 创建RabbitMQ配置类 RabbitMQ消息的发送 RabbitMQ消息的接收 测试 结语 前言 前一篇,我们学习了Kafka的基本使用&#…...
蓝桥杯入职项目(HTML + springBoot)
文章目录需要解决npm包安装axioshttp-servedebug开发下个阶段测试运行方式注意清理磁盘缓存问题解决HTML Web项目的结构通常是基于MVC(Model-View-Controller)模式设计的。下面是一般的项目结构:index.html:项目的入口文件&#x…...
【IAR工程】STM8S208RB基于ST标准库下按键检测
【IAR工程】STM8S208RB基于ST标准库下按键检测📍相关篇《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》🎈《【IAR工程】STM8S208RB基于ST标准库下EXTI外部中断》🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:2.3.1&…...
【5】深度学习之Pytorch——如何使用张量处理文本数据集(语料库数据集)
在计算机领域,不断崛起的两个领域,一个是CV一个是NLP,下面我们可以探索一下深度学习在NLP的应用和特点。 深度学习在自然语言处理(NLP)领域有广泛的应用。以下是一些主要的应用和特点: 语音识别࿱…...
《Spring系列》第5章 refresh()
前言 Spring框架中最重要的肯定是IOC容器,那么其如何进行初始化,就是通过refresh()这个方法,无论是单独使用Spring框架,还是SpringBoot,最终都会通过执行到这个方法,那么下面会介绍一下这个方法 一、IOC容…...
ThreeJS-缩放、旋转(四)
代码: <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {OrbitControls } from three/examples/jsm/controls/OrbitControls export default { name: &quo…...
【Python原生AOT编译终极指南】:2026年CPython 3.15+官方AOT源码级拆解与生产落地避坑清单
第一章:Python原生AOT编译的演进脉络与3.15官方定位Python长期以来以解释执行和字节码(.pyc)为默认运行范式,AOT(Ahead-of-Time)编译长期处于社区实验阶段。从Nuitka、Cython到PyO3/Rust绑定,再…...
腾讯云轻量服务器+宝塔面板:新手零代码搭建个人网站的保姆级避坑指南
腾讯云轻量服务器宝塔面板:新手零代码搭建个人网站的保姆级避坑指南 你是否曾经想过拥有一个属于自己的网站,却因为不懂代码和服务器运维而望而却步?现在,即使你没有任何技术背景,也能轻松实现这个梦想。本文将带你一步…...
AIGlasses_for_navigation多场景落地:日常通勤、医院导诊、地铁站导航三场景实测
AIGlasses_for_navigation多场景落地:日常通勤、医院导诊、地铁站导航三场景实测 1. 引言:当导航从手机屏幕“走”到眼前 想象一下这样的场景:你走在陌生的城市街道,要去一个从未去过的咖啡馆。你不需要低头看手机地图ÿ…...
如何突破Office功能限制?本地化激活方案全解析
如何突破Office功能限制?本地化激活方案全解析 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 当…...
102. 在控制平面主机名更改后恢复 Rancher 配置的 RKE2 集群
Environment 环境 Rancher provisioned RKE2 downstream cluster control plane node hostname changed, without removing the node from the cluster. Rancher 配置了 RKE2 下游集群控制平面节点的主机名更改,但未将该节点从集群中移除。 Procedure 程序It is …...
CryptoJS不同加密模式对比:AES-CBC vs GCM在前端安全中的选择指南
AES加密模式深度解析:CBC与GCM在前端安全中的实战抉择 前端开发者在处理用户敏感数据时,AES加密已成为标配技术方案。但在具体实施过程中,加密模式的选择往往成为决策难点——是选择经典的CBC模式,还是拥抱更现代的GCM模式&#x…...
掌握QMK Toolbox的4个实战阶段:开源键盘定制工具从入门到精通的学习路径
掌握QMK Toolbox的4个实战阶段:开源键盘定制工具从入门到精通的学习路径 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox QMK Toolbox是一款专为机械键盘定制开发的开源工具&a…...
源代码之下的硅基启示录——Claude Code“核泄漏”事件的深度剖析与时代回响
引言 公元2026年3月30日,一个看似平常的春日,硅基世界却迎来了一场史无前例的地震。 一家以“安全”为最高信条的AI公司,以一种最荒诞的方式,亲手打开了潘多拉的魔盒。Anthropic,这家估值高达3800亿美元的AI新贵&#…...
ftools架构深度解析:Stata大数据处理的技术革命
ftools架构深度解析:Stata大数据处理的技术革命 【免费下载链接】ftools Fast Stata commands for large datasets 项目地址: https://gitcode.com/gh_mirrors/ft/ftools 在数据科学和经济学研究的实践中,Stata用户经常面临一个共同的挑战&#x…...
算法对齐还是实战突围?解构GEO优化中方法论与实践的权重博弈
在生成式人工智能(AIGC)重塑全球信息检索范式的当下,生成式引擎优化(Generative Engine Optimization, GEO)已从一种前沿概念演变为品牌流量增长的底层操作系统。随着大语言模型(LLM)与检索增强…...



这样下来从上到下都有改变,整个代码的耦合性太高了。


