Spring IoC和DI概念篇

目录

[一、Spring、Spring MVC、Spring Boot的关系和区别](#一、Spring、Spring MVC、Spring Boot的关系和区别)

1.1Spring是什么?

[1.2Spring MVC是什么?](#1.2Spring MVC是什么?)

[1.3Spring Boot是什么?](#1.3Spring Boot是什么?)

1.4三者关系总结

二、IoC入门:什么是容器、IoC、DI

2.1什么是容器?

2.2什么是IoC?

2.3什么是DI?

三、案例:用"造一辆车"理解传统开发与IoC

3.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、DI

2.1什么是容器?

像之前接触到的 List/Map-->数据存储容器、Tomcat-->Web容器、Spring-->IoC容器

2.2什么是IoC?

IoC:Inversion of Control(控制反转),Spring是一个"控制反转"的容器,就是获得依赖对象的过程被反转了。

当需要某个对象时,传统开发模式中需要自己通过new创建对象,现在不需要再进行创建,把创建对象的任务交给容器,程序只需要依赖注入。

2.3什么是DI?

DI:Dependency Injection(依赖注入)。

容器在运行期间,动态地为应用程序提供运行时所依赖地资源,称之为依赖注入。

程序运行时需要某个资源,此时容器就为其提供这个资源。

三、案例:用"造一辆车"理解传统开发与IoC

3.1传统程序开发

需求:造一辆车。设计:先造轮子,根据轮子大小设计底盘,根据底盘设计车身,最后根据车身设计整个汽车。

最后程序实现

java 复制代码
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问题分析

这样的设计可维护性很低,如果需要加工多种尺寸的轮胎

java 复制代码
static class Tire {
    // 尺寸
    private int size;

    public Tire(int size) {
        this.size = size;
        System.out.println("轮胎尺寸:" + size);
    }
}

修改轮胎后,其他调用程序也会报错,都要修改,这样耦合度非常高。

3.3解决方案

在初始设计:根据轮子的尺寸设计底盘,轮子尺寸一改,底盘就得改,整个设计都得改。

那么换个设计思路:先设计车子大概样子,然后逐步向下,这时候就是轮子依赖底盘,底盘依赖车身,车身依赖汽车。

java 复制代码
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 控制并创建了 Framework,Framework 创建了 Bottom,依次往下。而改进之后的控制权发生了反转,不再是使用方对象创建并控制依赖对象了,而是把依赖对象注入到当前对象中,依赖对象的控制权不再由当前类控制了。

这样的话,即使依赖类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

IoC具备以下优点:

资源不由使用资源的双方管理,而是由不使用资源的第三方管理

资源集中管理,实现资源的可配置和易管理。

降低了使用资源双方的依赖程度,也就是耦合度

相关推荐
Cheney Pan1 小时前
第4篇 Spring Boot 应用监控:Micrometer 与 JVM 指标
jvm·spring boot·后端·prometheus
阿钱真强道1 小时前
30 嵌入式操作系统 | 上位机界面:Flask 网页显示 + 控制闭环
后端·python·flask
小狼154541 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang52 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu2 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
念何架构之路2 小时前
go-grpc服务端调用
开发语言·后端·golang
我的div丢了肿么办2 小时前
go语言中如何安装第3方的包
后端·go
弹简特2 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot
小蒜学长2 小时前
基于Spring Boot+Vue的“禾源”农产品销售系统设计与实现(代码+数据库+LW)
java·spring boot·后端·农产品销售系统·产品溯源