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

Spring---IOC与DI

文章目录

  • 什么是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.kler.cn/a/147828.html

相关文章:

  • 深度学习之pytorch常见的学习率绘制
  • 苦等三年!金克斯大人回来了!
  • SQL 注入详解:原理、危害与防范措施
  • 城市轨道交通数据可视化的应用与优势
  • 阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
  • 【计算机网络】【传输层】【习题】
  • 直播场景视频和特效解决方案
  • docker nginx imclude
  • JavaEE(SpringMVC)期末复习(选择+填空+解答)
  • 原生js和jQuery的区别
  • 使用 Lhotse 高效管理音频数据集
  • vue3+ts 依赖注入 provide inject
  • Vue3中调用外部iframe链接方法
  • 6.一维数组——用冒泡法,选择法将5个整数由大到小排序
  • DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式
  • UE使用C++通过定时器启用和停用Tick
  • Vue3水印(Watermark)
  • linux防火墙免费版添加UA屏蔽某些垃圾蜘蛛
  • linux 内核线程
  • dpkg、apt、rpm、yum、dnf使用
  • css优化滚动条样式
  • 【Kotlin】类与接口
  • vue3 终端实现 (vue3+xterm+websocket)
  • ubuntu 安装python3.13
  • React自定义 Hook
  • 人工智能-优化算法和深度学习