【Spring】-Spring的IoC和DI

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏:【Framework】
主要内容:什么是spring?IoC容器是什么?如何使代码解耦合?IoC的核心原理,IoC的优点。依赖注入/对象装配/DI。

在这里插入图片描述

在这里插入图片描述

文章目录

    • 一、什么是Spring?
      • 1)什么是IoC容器?
        • 1> 理解
        • 2> 法一,传递(存在依赖关系传对象)
        • 3> 法二,使用Spring
          • Spring IoC 核心操作:
          • Spring IoC 优点:
      • 2)什么是DI?

一、什么是Spring?

Spring:包含了 众多工具方法IoC 容器。

1)什么是IoC容器?

1> 理解

IoC 全称 Inversion of Control,翻译为控制反转。因此IoC容器就是控制反转的容器。那啥是 控制反转?Spring框架管理Bean的创建工作。即由用户管理Bean变为框架管理Bean

① 举个例子:接下来我们举个例子,并使用代码来感受啥是个IoC(控制反转),有什么好处:
比如建造一个房子,粗略的看,首先需要打地基,然后砌砖,最后挂房梁瓦片等。如果用代码实现这样一个粗略的过程,看下面代码:

//测试类
public class Test {public static void main(String[] args) {House house = new House();house.init();}
}
//房
public class House {public void init(){// 创建房子 依赖于挂房梁等操作Beam beam = new Beam();beam.init();System.out.println("House: House create");}
}
//房梁
public class Beam {private String material;//(杉木)public void init(){// 挂房梁等 依赖于 砌好砖Brick brick = new Brick();brick.init();System.out.println("Bean: 房梁木用 " + this.material);}
}
//砖
public class Brick {private String redBrick;//红砖public void init(){// 砌砖 依赖于 已经打好地基Foundation foundation = new Foundation();foundation.init();System.out.println("Brick: 砌砖用 " + this.redBrick);}
}
//地基
public class Foundation {private String rebar;//钢筋private String cement;//水泥public void init(){System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);}
}

上述代码运行结果如下:
在这里插入图片描述

② 理解代码:上面的代码中,测试类中的main方法运行后,会创建一个空House对象,再进行House对象的初始化;在House对象初始化时,会创建一个空的Beam对象,然后进行beam对象的初始化(house依赖于beam,房子依赖于房梁);beam初始化时,会创建Brick对象,再进行brick对象的初始化(beam依赖于brick,房梁依赖于砌好砖);brick对象初始化时,会创建Foundation对象,并进行foundation对象的初始化。
简单来说,要想建房子,得先挂好房梁,要想挂房梁,得先砌好砖,要想砌砖,得先打好地基,这就是一个逐层调用进行初始化的过程,最终建好一个房子。但是这样操作会引入一个很致命的问题:代码耦合度非常高!

③ 问题:这样互相依赖的过程,如果底层的类发生改变,上层的类得相应改变。在上面代码中,我使用钢筋水泥打地基,用红砖来砌砖,用杉木来做房梁木,在每个类的调用init方法时将所需参数传进去,进行材料的初始化(我这里没弄,所以都是null)。那么理解到这里我们可以想一个问题,如果我不再使用红砖来砌砖,而是使用水泥砖了,或者我需要制定特定尺寸的砖,那么Brick类的属性就需要修改调整。这样在上层调用中(beam)也需要修改,在Beam类的init方法中,创建了Brick类,并使用brick.init(参数)这个方法进行砌砖的初始化,那么这里也是需要修改的,如果上层还有给brick传参的方法,那也还需要改,所以这样操作,代码耦合度会非常高。

④ IoC和Spring:怎么才能降低耦合,减少修改的成本?因为上述代码出现高耦合的原因:在当前类中的方法中,创建当前类所依赖的类的对象并逐层调用初始化对象,或者上层的代码给底层的类的属性传参数。
法一:当存在依赖关系时,在当前类的方法中不再自己创建和销毁所依赖的对象,而是让调用者传一个依赖对象给当前类(当前类需要一个成员变量是它所依赖的类),如果这个类还存在其他属性,也由调用者提供参数(这样就可保证,在我需要修改某一个类的成员或者类型时,其他类不需要做修改,即实现解耦合)。
法二:那如果我不让它逐层调用,而是统一交给一个工具去创建对象并初始化并管理对象呢?这就是控制反转,Spring就是管理对象的这样一个容器。

⑤ Spring:在管理方面,Spring是一个 IoC容器,它可以管理对象,包括创建销毁对象等。在操作方面,又因为是个 IoC容器,因此可以把对象存进Spring或者从Spring中获取对象。

2> 法一,传递(存在依赖关系传对象)

//测试类
package demo2;
public class Test {//测试传对象 解耦合代码public static void main(String[] args) {Foundation foundation = new Foundation("xx号钢筋", "xx号水泥");Brick brick = new Brick(foundation, "xx号红砖");Beam beam = new Beam(brick, "杉木");House house = new House(beam);house.init();}
}//House类
package demo2;
public class House {private Beam beam;public House(Beam beam){this.beam = beam;}public void init(){// 创建房子 依赖于挂房梁等操作beam.init();System.out.println("house: 房子建成");}
}//Beam类
package demo2;
public class Beam {private Brick brick;private String material;public Beam(Brick brick, String material){this.brick = brick;this.material = material;}public void init(){// 挂房梁等 依赖于 砌好砖brick.init();System.out.println("Bean: 房梁木用 " + this.material);}
}//Brick类
package demo2;
public class Brick {private Foundation foundation;private String redBrick;//红砖public Brick(Foundation foundation, String redBrick){// 砌砖 依赖于 已经打好地基this.foundation = foundation;this.redBrick = redBrick;//新增}public void init(){this.foundation.init();System.out.println("Brick: 砌砖用 " + this.redBrick);}
}//Foundation类
package demo2;
public class Foundation {private String rebar;//钢筋private String cement;//水泥public Foundation(String rebar, String cement){this.rebar = rebar;this.cement = cement;}public void init(){System.out.println("Foundation: 打地基用 " + this.rebar +" "+ this.cement);}
}

运行结果:
在这里插入图片描述

3> 法二,使用Spring

具体操作,看后面的博客

Spring IoC 核心操作:

存对象 取对象

Spring IoC 优点:

解耦合
使用方便(不再需要手动创建对象)
更加高效(默认情况,使用相同类只需要创建一个对象)

2)什么是DI?

IoC,(Inversion of Control 控制反转)是一种设计原则,指的是将对象的创建和依赖关系交给容器来完成而不是由对象自己管理依赖对象。
DI,(Dependency Injection 依赖注入),是IoC的一种具体的实现方式,它是通过将依赖对象注入到对象中来实现对象之间的解耦。
简而言之,IoC是一种思想,而DI是IoC的一种具体实现方式

补充1:实现IoC除了DI之外,还需要控制反转容器(在Spring中就是Spring容器)和配置信息(xml文件,描述对象和依赖关系的元数据)。

补充2:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩(在这里列出这种序号,需要的自取)。

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

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

相关文章

Linux下在qtcreator中创建qt程序

目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程(基于多工程目录结构) 5、 .pro文件 1、新建项目 切换到“编辑”界面,点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库,一套典型的移动端办公工具型APP Axure RP原型模板,可根据实际的产品需求进行扩展,也可以作为移动端原型设计的参考案例。为提升本作品参考价值,在模板设计过程中尽量追求…

chatGPT应用于房地产行业

作为 2023 年的房地产专业人士,您无疑认识到技术对行业的重大影响。近年来,一项技术进步席卷了世界——人工智能。人工智能彻底改变了房地产业务的各个方面,从简化管理任务到增强客户互动。 在本文中,我们将探讨几种巧妙的人工智…

zabbix自动注册服务器以及部署代理服务器

文章目录 Zabbix自动注册服务器及部署代理服务器一.zabbix自动注册1.什么是自动注册2.环境准备3.zabbix客户端配置4.在 Web 页面配置自动注册5.验证自动注册 二.部署 zabbix 代理服务器1.分布式监控的作用:2.环境部署3.代理服务器配置4.客户端配置5.web页面配置5.1 …

分类预测 | MATLAB实现GWO-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现GWO-BiLSTM-Attention多输入分类预测 目录 分类预测 | MATLAB实现GWO-BiLSTM-Attention多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.GWO-BiLSTM-Attention 数据分类预测程序 2.代码说明:基于灰狼优化算法&#xff08…

微信小程序(原生)搜索功能实现

一、效果图 二、代码 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"请输入关键词"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…

运维监控学习笔记1

1、监控对象&#xff1a; 1、监控对象的理解&#xff1b;CPU是怎么工作的&#xff1b; 2、监控对象的指标&#xff1a;CPU使用率&#xff1b;上下文切换&#xff1b; 3、确定性能基准线&#xff1a;CPU负载多少才算高&#xff1b; 2、监控范围&#xff1a; 1、硬件监控&#x…

线性扫描寄存器分配算法介绍

线性扫描寄存器分配 文章目录 线性扫描寄存器分配1. 算法介绍2. 相关概念3. 算法的实现3.1 伪代码3.2 图示 参考文献 论文地址&#xff1a; Linear Scan Register Allocation ​ 我们描述了一种称为线性扫描的快速全局寄存器分配的新算法。该算法不基于图形着色&#xff0c;而…

echarts3d柱状图

//画立方体三个面 const CubeLeft echarts.graphic.extendShape({shape: {x: 0,y: 0,width: 9.5, //柱状图宽zWidth: 4, //阴影折角宽zHeight: 3, //阴影折角高},buildPath: function (ctx, shape) {const api shape.api;const xAxisPoint api.coord([shape.xValue, 0]);con…

陪诊小程序开发|陪诊陪护小程序让看病不再难

陪诊小程序通过与医疗机构的合作&#xff0c;整合了医疗资源&#xff0c;让用户能够更加方便地获得专业医疗服务。用户不再需要面对繁琐的挂号排队&#xff0c;只需通过小程序预约服务&#xff0c;便能够享受到合适的医疗资源。这使得用户的就医过程变得简单高效&#xff0c;并…

【EI/SCOPUS检索】第三届计算机视觉、应用与算法国际学术会议(CVAA 2023)

第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023) The 3rd International Conference on Computer Vision, Application and Algorithm 2023年第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023&#xff09;主要围绕计算机视觉、计算机应用、计…

PPT颜色又丑又乱怎么办?

一、设计一套PPT时&#xff0c;可以从这5个方面进行设计 二、PPT颜色 &#xff08;一&#xff09;、PPT常用颜色分类 一个ppt需要主色、辅助色、字体色、背景色即可。 &#xff08;二&#xff09;、搭建PPT色彩系统 设计ppt时&#xff0c;根据如下几个步骤&#xff0c;依次选…

Arduino驱动红外二氧化碳传感器(气体传感器篇)

目录 1、传感器特性 2、驱动程序 红外激光传感器是将成熟的红外吸收气体检测技术与精密光路设计、精良电路设计紧密结合而制作出的高性能传感器,具有高灵敏度、高分辨率、低功耗,响应快、抗水汽干扰、不中毒、稳定性高、使用寿命长等特点。本篇博文使用Arduino驱动红外二氧…

Android学习之路(2) 设置视图

一、设置视图宽高 ​ 在Android开发中&#xff0c;可以使用LayoutParams类来设置视图&#xff08;View&#xff09;的宽度和高度。LayoutParams是一个用于布局的参数类&#xff0c;用于指定视图在父容器中的位置和大小。 ​ 下面是设置视图宽度和高度的示例代码&#xff1a; …

Win10基于 Anaconda 配置 Deeplabcut 环境

最近需要做动物行为学分析的相关研究&#xff0c;同时由于合作者只有 Windows 系统&#xff0c;于是只好在 Windows 中配置环境。说实话还真的是挺折磨的。。。 一、下载 Anaconda 可以通过清华源下载 Anaconda&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/ar…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具&#xff0c;报表就只是报表&#xff0c;而奥威BI数据可视化工具&#xff0c;一张报表就约等于一个平台&#xff0c;可随时展开多维动态自助分析&#xff0c;按需分析&#xff0c;立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

电脑xinput1_3.dll丢失的解决方法?哪个解决方法更简单

最近在打开软件或者游戏的时候&#xff0c;电脑提示xinput1_3.dll文件丢失的错误。这个问题导致我无法运行某些游戏和应用程序。通过一番尝试和研究&#xff0c;我找到了一些修复xinput1_3.dll文件丢失的方法&#xff0c;并在此分享给大家。 首先&#xff0c;我了解到xinput1_3…

NSI45030AT1G LED驱动器方案为汽车外部及内部照明恒流稳流器(CCR)方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

红日ATT&CK VulnStack靶场(三)

网络拓扑 web阶段 1.扫描DMZ机器端口 2.进行ssh和3306爆破无果后访问web服务 3.已知目标是Joomla&#xff0c;扫描目录 4.有用的目录分别为1.php 5.configuration.php~中泄露了数据库密码 6.administrator为后台登录地址 7.直接连接mysql 8.找到管理员表&#xff0c;密码加密了…