Spring IoC和DI概念篇

发布时间:2026/9/27 7:55:08
Spring IoC和DI概念篇 目录一、Spring、Spring MVC、Spring Boot的关系和区别1.1Spring是什么1.2Spring MVC是什么1.3Spring Boot是什么1.4三者关系总结二、IoC入门什么是容器、IoC、DI2.1什么是容器2.2什么是IoC2.3什么是DI三、案例用“造一辆车”理解传统开发与IoC3.1传统程序开发3.2问题分析3.3解决方案3.4IoC优势一、Spring、Spring MVC、Spring Boot的关系和区别1.1Spring是什么Spring是一个开源框架它让我们的开发更加简单。它支持广泛的应用场景有着活跃而庞大的社区这也是Spring能够长久不衰的原因。Spring是包含了众多工具方法的IoC容器。主要功能把对象交给Spring管理、从Spring中获取对象、管理对象、管理对象之间的依赖关系、面向切面编程AOP、数据库事务管理、数据访问、Web框架支持Spring具备高度可开放性并不强制依赖Spring开发者可自由选择Spring的部分或者全部。Spring可以无缝集成第三方框架比如数据访问框架Hibernate、JPA、Web框架Struts、JSF等。1.2Spring MVC是什么Spring MVC是Spring的一个子框架。Spring诞生之后大家觉得好用于是按照MVC模式设计了一个MVC框架主要用于开发Web应用和网络接口。所以Spring MVC是一个Web框架。它基于Spring进行开发天生与Spring框架集成。可以让我们更简洁地进行Web层开发支持灵活地URL到页面控制器地映射提供强大的“约定大于配置”的契约式编程支持非常容易与其他框架集成。1.3Spring Boot是什么Spring Boot式对Spring的一个封装为了简化Spring应用的开发而出现。Spring Boot是个脚手架插拔式搭建项目可以快速集成其他框架进来。比如想使用Spring Boot开发Web项目只需引入Spring MVC框架即可Web开发的工作式Spring MVC完成的而不是Spring Boot 。想完成数据访问只需要引入MyBatis框架即可。Spring Boot只是完成辅助简化项目开发的让开发变得更加简单甚至不需要额外的Web服务器直接生成jar包执行即可。1.4三者关系总结Spring核心框架提供IoC、DI、AOP等Spring MVC基于Spring的Web框架Spring Boot 基于Spring的快速开发整合包。Spring MVC 和Spring Boot都属于Spring Spring MVC是基于Spring的一个MVC框架而Spring Boot是基于Spring的一套快速开发整合包。二、IoC入门什么是容器、IoC、DI2.1什么是容器像之前接触到的 List/Map--数据存储容器、Tomcat--Web容器、Spring--IoC容器2.2什么是IoCIoCInversion of Control控制反转Spring是一个“控制反转”的容器就是获得依赖对象的过程被反转了。当需要某个对象时传统开发模式中需要自己通过new创建对象现在不需要再进行创建把创建对象的任务交给容器程序只需要依赖注入。2.3什么是DIDIDependency Injection依赖注入。容器在运行期间动态地为应用程序提供运行时所依赖地资源称之为依赖注入。程序运行时需要某个资源此时容器就为其提供这个资源。三、案例用“造一辆车”理解传统开发与IoC3.1传统程序开发需求造一辆车。设计先造轮子根据轮子大小设计底盘根据底盘设计车身最后根据车身设计整个汽车。最后程序实现public class NewCarExample { public static void main(String[] args) { Car car new Car(); car.run(); } /** * 汽车对象 */ static class Car { private Framework framework; public Car() { framework new Framework(); System.out.println(Car init....); } public void run() { System.out.println(Car run....); } } /** * 车身类 */ static class Framework { private Bottom bottom; public Framework() { bottom new Bottom(); System.out.println(Framework init....); } } /** * 底盘类 */ static class Bottom { private Tire tire; public Bottom() { this.tire new Tire(); System.out.println(Bottom init....); } } /** * 轮胎类 */ static class Tire { // 尺寸 private int size; public Tire() { this.size 17; System.out.println(轮胎尺寸 size); } } }3.2问题分析这样的设计可维护性很低如果需要加工多种尺寸的轮胎static class Tire { // 尺寸 private int size; public Tire(int size) { this.size size; System.out.println(轮胎尺寸 size); } }修改轮胎后其他调用程序也会报错都要修改这样耦合度非常高。3.3解决方案在初始设计根据轮子的尺寸设计底盘轮子尺寸一改底盘就得改整个设计都得改。那么换个设计思路先设计车子大概样子然后逐步向下这时候就是轮子依赖底盘底盘依赖车身车身依赖汽车。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; System.out.println(Car init....); } public void run() { System.out.println(Car run...); } } static class Framework { private Bottom bottom; public Framework(Bottom bottom) { this.bottom bottom; System.out.println(Framework init...); } } static class Bottom { private Tire tire; public Bottom(Tire tire) { this.tire tire; System.out.println(Bottom init...); } } static class Tire { private int size; public Tire(int size) { this.size size; System.out.println(轮胎尺寸 size); } } }3.4IoC优势在传统代码中对象创建顺序是Car → Framework → Bottom → Tire改进之后Tire → Bottom → Framework → Car传统代码是 Car 控制并创建了 FrameworkFramework 创建了 Bottom依次往下。而改进之后的控制权发生了反转不再是使用方对象创建并控制依赖对象了而是把依赖对象注入到当前对象中依赖对象的控制权不再由当前类控制了。这样的话即使依赖类发生任何改变当前类都是不受影响的这就是典型的控制反转也就是 IoC 的实现思想。IoC具备以下优点资源不由使用资源的双方管理而是由不使用资源的第三方管理资源集中管理实现资源的可配置和易管理。降低了使用资源双方的依赖程度也就是耦合度