Spring---IOC与DI

news2024/12/24 10:30:56

文章目录

  • 什么是Spring?
  • 什么是Ioc?
    • 通过代码案例理解
    • 总结代码案例
    • 真正理解Ioc
  • 什么是DI?

什么是Spring?

Spring指的是 Spring Framework (Spring框架),它是一个开源的框架,有着活跃而庞大的社区。Spring支持广泛的应用场景,可以让Java程序的开发更加简单。

简单用一句话来概括 Spring 就是:Spring 是一个包含了众多工具方法的 Ioc 容器。

什么是容器呢?
容器就是用来容纳某种物品的装置,对于 Spring 来说,它容纳的是对象,我们可以把对象存入 Spring中,也可以把对象从 Spring 中取下来。

包含的众多工具方法是指:Spring 为我们提供了一些现成的方法来解决一些常见的问题,我们只需要直接调用即可。

什么是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() {
 			// 依赖⻋身
 			Framework framework = new Framework();
 			framework.init();
 		}
	}
	
 	/**
	 * ⻋身类
	 */
 	static class Framework {
 		public void init() {
 			// 依赖底盘
 			Bottom bottom = new Bottom();
 			bottom.init();
 		}
 	}
 	
 	/**
 	* 底盘类
 	*/
 	static class Bottom {
		 public void init() {
 			// 依赖轮胎
 			Tire tire = new Tire();
 			tire.init();
 		}
 	}
 	
 	/**
 	* 轮胎类
 	*/
 	static class Tire {
 		// 尺⼨
 		private int size = 30;
 		public void init() {
 			System.out.println("轮胎尺⼨:" + size);
 		}
 	}
}

问题:当底层代码改动之后,整个调用链上的代码都要修改。
解决:不在每个类中创建下级类,这样就没有依赖关系了。交给 Spring 管理即可。

  • Spring 开发
//Spring 开发解决依赖问题

public class IocCarExample {
 	public static void main(String[] args) {
 		Tire tire = new Tire(20);
 		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() {
 			framework.init();
 		}
	}
	
 	static class Framework {
 		private Bottom bottom;
 		public Framework(Bottom bottom) {
 			this.bottom = bottom;
 		}
 		public void init() {
 			bottom.init();
 		}
 	}
 	
 	static class Bottom {
 		private Tire tire;
 		public Bottom(Tire tire) {
 			this.tire = tire;
 		}
 		public void init() {
 			tire.init();
 		}
 	}
 	
 	static class Tire {
 		private int size;
 		public Tire(int size) {
 			this.size = size;
 		}
 		public void init() {
 			System.out.println("轮胎:" + size);
 		}
 	}
}

代码经过以上调整,不管底层代码如何修改都不会影响到调用链上的代码。

总结代码案例

在这里插入图片描述
我们可以看到使用 Spring 后对象的控制权发生了反转。不再是上级对象创建并控制下级对象了,而是把下级对象注入到上级对象中。

真正理解Ioc

Spring 是一个Ioc(控制反转)容器。控制反转是特性,容器才是本质。既然是容器,它就具备两个基本功能:将对象存入容器、从容器中取出对象。那么 Spring 是一个Ioc容器 再换句话说就是,对象的创建和销毁的权力都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力。

把对象放到容器中有什么好处呢?

将对象存储到 Ioc容器 中,相当于把以后可能会用到的所有工具都制作好放到仓库中,需要的使用直接取走使用,用完了再放回仓库中。
而 new 对象的方式,相当于每次需要使用工具了才现做,用完了也不保存,下次再用的时候还得再做。

总结:使用 Spring 来管理对象后,每个对象都是一个个体,他们之间没有依赖关系,各自实现各自的功能,不会相互影响。由 Spring来控制他们进行合作配合。

什么是DI?

DI:Dependency Injection,意思是“依赖注入”。就是在 Ioc容器 运行期间,动态的将某种依赖关系注入到对象中。

所以,Ioc 和 DI 是从不同的角度来描述同一件事情。就是指通过 Ioc 容器 ,利用 DI 的方式,来实现对象间的解耦合。

Ioc 是一种思想;DI 是具体的实现。

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

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

相关文章

【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)

目录 8.7 引用(Reference) 8.7.1 普通变量引用 8.7.2 数组引用 8.7.3 指针变量的引用方法 8.7.4 函数的引用 8.7.5 引用作为函数的参数 8.7.6 引用作为函数的返回值类型 1. 返回值类型不用使用局部变量的引用类型 2.返回值类型为引用&#xff0…

es集群相关报错信息

给es集群添加用户密码的时候,会自动弹出相关的账户信息,这个时候,只需要设置对应密码就可以了 [esuserjky-test1 bin]$ ./elasticsearch-setup-passwords interactive future versions of Elasticsearch will require Java 11; your Java ve…

【Linux】了解进程的基础知识

进程 1. 进程的概念1.1 进程的理解1.2 Linux下的进程1.3 查看进程属性1.4 getpid和getppid 2. 创建进程3. 进程状态4. 进程优先级5. 进程切换6. 环境变量7. 本地变量与内建命令 1. 进程的概念 一个已经加载到内存中的程序,叫做进程(也叫任务&#xff09…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…

GAN:ImprovedGAN-训练GAN的改进策略

论文:https://arxiv.org/abs/1606.03498 代码:https://github.com/openai/improved_gan 发表:NIPS 2016 一、文章创新 1:Feature matching:特征匹配通过为生成器指定新目标来解决GANs的不稳定性,从而防止…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处,未来 很清楚展示GPT插件的调用过程: 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能(AI)的最危险之处通常与以下几个方面有关: 自主决策能力过强&…

一篇博客带你了解TCP网络传输协议

Transmission Control Protocol(TCP,传输控制协议)是互联网协议套件中的一种主要协议之一,负责在网络上可靠地传输数据。下面是TCP协议的详细讲解: 1. 基本概念: 面向连接: TCP是一种面向连接的…

2.安装docker

目录 1 安装依赖 2 安装docker 3 测试 目前docker分为三类 Docker-CE(社区版),Docker-EE(企业版)和Moby。Moby是docker社区用户自己写的,所以Moby我们一般用不上 每一类的每一个版本中都有Edge与Stable版,Stable维护4个月,Edge维护1个…

在柯桥西班牙语论文写作,连接词只会用porquepero?西语连接词大全来啦~

Adicin -agregan nuevos datos al desarrollo de una idea o introduce otro aspecto del tema. 为观点的论述增添新的信息,或介绍主题的另一个方面。 1 Lista de conectores 连接词列表 Adems. As mismo. Hay que mencionar, adems. Habra que decir tambin. Mas …

当消费增值模式遇上Dapp:擦出创新商业的火花

随着区块链技术和智能合约的不断发展,去中心化应用(Dapp)逐渐成为一种创新的商业模式。当消费增值模式与Dapp相遇,它们之间擦出了怎样的火花呢? 一、Dapp与消费增值模式的结合 Dapp是一种基于区块链技术和智能合约的去…

分层理解Java字符串常量池

Java是一门计算机编程语言,但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机(JVM)的一系列规定,及具体Java产品(如Hotspot)的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事,为了偷懒,只能使出大招,毕竟自己不是那么老老实实干活的人,整理数据这类累和繁琐的活,我怎么能轻易动,好在gpt可以帮我来实现,有人可能会说,这么点内容你还不…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中,在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术,这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

面试题:说一下MyBatis动态代理原理?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具,封装了JDBC的操作&a…

k8s中pod的hostport端口突然无法访问故障处理

故障背景: 租户告知生产环境的sftp突然无法访问了,登录环境查看sftp服务运行都是正常的,访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查,看看哪里出了问题,看下sftp日志&#…

Java学习路线第二篇:Java Web

这篇则分享Java学习路线第二part:Java Web 恭喜你已经成功追到第二章节啦,要被自己的努力感动到了吧,而这节将承担起学完Java web 的使命,本使命为单向契约,你可选择YES或者选择YES。 HTMLCSSJavaScript(JS) 【动…

Linux—进程状态、僵尸进程、孤独进程、优先级

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、进程状态二、僵尸进程、孤儿进程1、Z(zombie)-僵尸进程2、僵尸进程危害3、孤儿进程 三、进…

DHCP协议及实验omnipeek抓包工具分析 IPv4协议

一 抓包命令 adb shell tcpdump -i wlan0 -w /data/tcpdump.pcap 抓包后截图如下 二 DHCP是什么 2.1 DHCP定义 DHCP( Dynamic Host Configuration Protocol, 动态主机配置协议)定义: 存在于应用层(OSI) 前身是BOOTP(Bootstrap Protocol)协议 是一个使用UDP(User …

【沁恒蓝牙mesh】程序烧录 硬件电路设计与原理

本文基于沁恒CH58X 单片机的程序烧录硬件电路设计原理解释 【沁恒蓝牙mesh】目录 1. 程序烧录方式2. USB 烧录过程描述3. 硬件设计原理图3.1 官方开发板原理图3.2 自开发设计原理图 4. 电容在上电瞬间为什么相当于短路? 📋 个人简介 💖 作者简…