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

Spring——Spring是什么?IoC容器是什么?

文章目录

  • 前言
  • 一、Spring是什么
    • 1.IoC 容器 —— 容器
    • 2.IoC 容器 —— IoC
      • 传统程序开发
      • 控制反转式程序开发
    • 3.Spring IoC
  • 二、DI是什么
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!


一、Spring是什么

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架) ,它是⼀个开源框架。Spring 支持⼴泛的应用场景,它可以让 Java 企业级的应用程序开发起来更简单。

用⼀句话概括 Spring:Spring 是包含了众多⼯具方法的 IoC 容器


1.IoC 容器 —— 容器

容器是⽤来容纳某种物品的(基本)装置。

书包是用来容纳书本的容器。
在这里插入图片描述
水杯是用来容纳水的容器。在这里插入图片描述
衣柜是用来容纳衣服的容器。
在这里插入图片描述
所以,容器就是用来容纳 / 存储某些东西的

像数据结构中的, 顺序表,链表,栈,队列,二叉树,哈希表等结构也是容器 ,只不过 这些容器存储的是数据

IoC容器,存储的是 “对象” (Java中的实例化对象)。


2.IoC 容器 —— IoC

IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器

控制反转,指的是控制权反转。

Java程序中对象的生命周期
不再由程序猿(代码片段)来控制
而是将 控制权反转
Spring(Spring容器/IoC容器)来控制


假设我们让程序来创建一台电脑。

传统程序开发

电脑(Computer)依赖CPU(Cpu),有CPU才能有电脑。
CPU依赖主板(Mainboard),有主板才能有CPU。
主板依赖电源(Power),有电源才能有主板。

在这里插入图片描述

public class Computer {public void init() {// 电脑依赖CPUCpu cpu = new Cpu();cpu.init();System.out.println("电脑创建成功");}
}class Cpu {public void init() {// CPU依赖主板Mainboard mainboard = new Mainboard();mainboard.init();System.out.println("CPU创建成功");}
}class Mainboard {// 主板依赖电源public void init() {Power power = new Power();power.init();System.out.println("主板创建成功");}
}class Power {private int size = 800;public void init() {System.out.println(size + "W电源创建成功");}
}
class Main {public static void main(String[] args) {Computer computer = new Computer();computer.init();}
}

在这里插入图片描述
以上程序中,CPU,主板,电源都是写死的,如果客户想要定制,假设客户想要定制一个特殊规格的电源。


修改后代码

public class Computer {public void init(int size) {// 电脑依赖CPUCpu cpu = new Cpu();cpu.init(size);System.out.println("电脑创建成功");}
}class Cpu {public void init(int size) {// CPU依赖主板Mainboard mainboard = new Mainboard();mainboard.init(size);System.out.println("CPU创建成功");}
}class Mainboard {// 主板依赖电源public void init(int size) {Power power = new Power(size);power.init();System.out.println("主板创建成功");}
}class Power {private int size;public Power(int size) {this.size = size;}public void init() {System.out.println(size + "W电源创建成功");}
}class Main {public static void main(String[] args) {Computer computer = new Computer();computer.init(1200);}
}

在这里插入图片描述

这样的传统开发代码耦合程度很高,当最底层代码改动之后,整个调用链上的所有代码都需要修改。


控制反转式程序开发

我们可以尝试 不在每个类中自己创建下级类 ,如果自己创建下级类就会出现当下级类发⽣改变操作,自己也要跟着修改。此时,我们只需要 将原来由自己创建的下级类,改为传递的⽅式(也就是注⼊的⽅式) ,因为我们不需要在当前类中创建下级类了,所以下级类即使发生变化(创建或减少参数),当前类本身也无需修改任何代码,这样就完成了程序的解耦。

基于以上思路,我们把调用汽车的程序示例改造⼀下,把创建子类的方式,改为注入传递的方式,具体实现代码如下:

public class Computer {private Cpu cpu;public Computer(Cpu cpu) {this.cpu = cpu;}public void init() {// 电脑依赖CPUcpu.init();System.out.println("电脑创建成功");}
}class Cpu {private Mainboard mainboard;public Cpu(Mainboard mainboard) {this.mainboard = mainboard;}public void init() {// CPU依赖主板mainboard.init();System.out.println("CPU创建成功");}
}class Mainboard {// 主板依赖电源private Power power;public Mainboard(Power power) {this.power = power;}public void init() {power.init();System.out.println("主板创建成功");}
}class Power {private int size;public Power(int size) {this.size = size;}public void init() {System.out.println(size + "W电源创建成功");}
}class MyContainer {public Power power;public Mainboard mainboard;public Cpu cpu;public Computer computer;public MyContainer() {this.power = new Power(1200);this.mainboard = new Mainboard(power);this.cpu = new Cpu(mainboard);this.computer = new Computer(cpu);}public Computer getComputer() {return computer;}
}class Main {public static void main(String[] args) {MyContainer mycontainer = new MyContainer();mycontainer.getComputer().init();}
}

我们可以看到传统程序开发中 由最高级的类,依次创建了需要的类。

而改进之后的 控制权反转 ,我们把控制权交给了容器Mycontainer后, 不再是上级对象创建并控制下级对象了 ⽽是下级对象把注⼊将当前对象中 下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的 这就是典型的控制反转,也就是 IoC 的实现思想

代码经过以上调整,无论底层类如何变化,整个调用链是不用做任何改变的,这样就完成了代码之间的解耦,从而实现了更加灵活、通用的程序设计了。


3.Spring IoC

文章开头提到过:Spring 是包含了多个⼯具方法的 IoC 容器,这就是对Spring 最核心的总结。

Spring 是⼀个 IoC(控制反转) 容器, IoC 代表的是对象的创建和销毁的权利都交给 Spring 来管理了

Spring 是⼀个 IoC容器, “容器”二字代表的是它具备两个最基础的功能:

  • 将对象存入到容器
  • 从容器中取出对象

这两个功能也是Spring最核心的功能。

将对象存储在容器中的好处
将对象放到容器中呢,就类似于线程池。
线程池会提前帮你创建好线程存在线程池中,你要用的时候拿就行,用完再放回来。
容器也是如此,帮你创建好对象就放在容器里,你用就拿,用完就换回来。
而普通程序开发则是要用的时候才创建对象,用完就销毁。


二、DI是什么

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注入”的意思。

所谓依赖注入,就是 由 IoC 容器在运⾏期间,动态地将某种依赖关系注入到对象之中 。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同⼀件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

也就是说,比如说我要创造一台电脑,在创建过程中。
我现在需要主板,我就动态的去容器中拿主板,注入到电脑中去。
这个过程就称之为依赖注入。


总结

以上就是今天要讲的内容,本文介绍了Spring是什么,要开启框架Spring的学习了。

路漫漫不止修身,也养性。

相关文章:

Spring——Spring是什么?IoC容器是什么?

文章目录 前言一、Spring是什么1.IoC 容器 —— 容器2.IoC 容器 —— IoC传统程序开发控制反转式程序开发 3.Spring IoC 二、DI是什么总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下…...

【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

golang深刻剖析——channel

文章目录 1 概念2 分类3 操作3.1 channel 的创建3.1.1 无缓冲channel3.1.1 带缓冲channel 3.2 channel的读写3.3 channel的关闭3.4 channel 和 select 4 channel 底层原理 1 概念 channel 是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队…...

ERROR in unable to locate ‘***/public/**/*‘ glob

前提 自己搭了一个react项目的脚手架,npm包下载一切都很正常,启动的时候突然就报ERROR in unable to locate ***/public/**/* glob这个错误,根据百度分析了一下产生的原因:webpack配置文件中的CopyWebpackPlugin导致的 网上给出的…...

简述一下你了解的 Java 设计模式

创建型模式 ★单例模式:保证某个类只能有一个唯一实例,并提供一个全局的访问点。 ★简单工厂:一个工厂类根据传入的参数决定创建出那一种产品类的实例。 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。 抽…...

[开发] 认证的几种方式简介

LDAP 认证 LDAP(轻量级目录访问协议)是一种用于访问和维护分布式目录信息的开放标准协议。它最初由电子数据系统公司(Netscape)开发,现在被广泛用于企业和组织中的身份认证和授权管理。LDAP的目标是为不同类型的应用程…...

ansible-playbook roles模块编写lnmp剧本

目录 一:集中式编写lnmp剧本 二:分布式安装lnmp 1、nginx 配置 2、mysql配置 3、php配置 4、运行剧本 一:集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml- name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condif…...

什么是汽车软件的模糊测试?

汽车软件的模糊测试(fuzz testing)是一种在软件开发过程中用来发现潜在漏洞和缺陷的测试方法。它通过输入大量的随机、无效或异常数据来模拟真实环境中各种可能的异常情况,以测试软件的健壮性和稳定性。 1. 确定模糊测试的目标:确…...

Datax使用

参考文档 datax 安装包 安装包 安装java sudo yum install java-1.8.0-openjdk sudo yum install java-1.8.0-openjdk-develvim /etc/profileexport JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64 export PATH$JAVA_HOME/bin:$PATHsource /etc…...

HTML不常用但是好用的标签

sub sup <p>这个文本包含 <sub>111</sub>文本。</p> <p>这个文本包含 <sup>上标</sup> 文本。</p>下标文本将会显示在当前文本流中字符高度的一半为基准线的下方&#xff0c;但是与当前文本流中文字的字体和字号都是一样的。…...

蓝桥杯2018省赛全球变暖dfs

全球变暖 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序 问题描述 格式输入 格式输出 输出一个整数 样例输入 样例输出 1 评测用例规模与约定 最大运行时间&#xff1a;1s最大运行内存: 256M 解析 采用dfs的方式进行搜索&#xff0c;首先输入地…...

Bean的作用域 - spring

前言 本篇介绍Bean的6种作用域&#xff0c;与通过注释修改作用域的方式&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. Bean的作用域1.1 singleton - 单例模式 - 默认作用域1.2 prototype - 原型…...

[ncnn]ncnnoptimize使用

usage: ncnnoptimize [inparam] [inbin] [outparam] [outbin] [flag] [cutstart] [cutend] 使用案例&#xff1a; ./ncnnoptimize yolov5s_6.2.param yolov5s_6.2.bin yolov5s_6.2_opt.param yolov5s_6.2_opt.bin 65536ncnnoptimize [原模型param文件] [原模型bin文件] [新模…...

Elasticsearch笔记

迈向光明之路&#xff0c;必定荆棘丛生。 文章目录 一、Elasticsearch概述二、初识ES倒排索引1. 正向索引2. 倒排索引 三、ES环境搭建1. 安装单机版ES2. 安装Kibana3. 安装ik分词器3.1 在线安装ik插件3.2.离线安装ik插件&#xff08;推荐方式&#xff09;3.3 自定义词典 四、ES…...

《怎样顺利通过答辩:论文答辩的策略与技巧》

最近在阅读《怎样顺利通过答辩这本书》&#xff0c;记录一下阅读获取的关键信息和心得。 目录 第一章 答辩是什么 在答辩前你需要做到以下几件事情&#xff0c;核查清单如下&#xff1a; 答辩根据考生及其研究的质量&#xff0c;服务于不同的目的&#xff1a; 通常意义上的…...

uniapp 微信小程序:页面+组件的生命周期顺序

uniapp 微信小程序&#xff1a;页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 这个uniapp的微信小程序项目使用的是 VUE2 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hov…...

Linux CentOS 8 编译安装Apache Subversion

前言 距离上一篇发表已经过去了5年零2个多月&#xff0c;这次重新开始写技术博客&#xff0c;理由和原来一样&#xff0c;也就是想把自己学习和工作中遇到的问题和知识记录下来&#xff0c;今天记录一下Linux CentOS 8通过编译安装svn的过程。 下载SVN 下载地址&#xff1a;…...

谈一谈缓存穿透,击穿,雪崩

缓存穿透 缓存穿透是指在使用缓存系统时&#xff0c;频繁查询一个不存在于缓存中的数据&#xff0c;导致这个查询每次都要通过缓存层去查询数据源&#xff0c;无法从缓存中获得结果。这种情况下&#xff0c;大量的请求会直接穿透缓存层&#xff0c;直接访问数据源&#xff0c;…...

如何对反编译的安卓应用进行调试并修改

安卓修改大师可以在没有源代码的情况下&#xff0c;直接反编译已经打包的APK安装包&#xff0c;通过修改SMALI代码实现添加和去除部分功能&#xff0c;并在应用的任何地方添加任意代码&#xff0c;增加任意任何您想实现的功能。通过这种方式&#xff0c;把该应用变为您自己的应…...

C#实现数据库数据变化监测(sqlservermysql)

监测数据库表数据变化&#xff0c;可实现数据库同步&#xff08;一主一从&#xff08;双机备份&#xff09;&#xff0c;一主多从&#xff08;总部数据库&#xff0c;工厂1&#xff0c;工厂2&#xff0c;工厂数据合并到总部数据&#xff09;&#xff09; sqlserver 启用数据库…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

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

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