初识Spring——IoC及DI详解

news2024/11/15 1:58:49

目录

一,什么是Spring

Spring设计核心

Spring核心定义

Spring官网

二,什么是IoC

IoC思想

 控制权的反转

 三,什么是DI

DI的定义

DI和IoC的关系


一,什么是Spring

Spring设计核心

我们常说的Spring其实指的是Spring Framewoke(俗称Spring框架),它是一个开源框架,有着活跃而庞大的社区,Spring框架的主要目的就是让Java企业级的程序开发起来更加简单(如JavaWeb项目中可以不需要自己实现Tomcat Servlet服务器,内部已经封装好了)。

Spring核心定义

Spring的核心定义用一句话就可以概括:Spring是包含了众多工具方法的IoC容器;既然提到了容器(类似于之前数据结构中的集合类:List Map,他们也是容器,用来存储数据的),Spring也不例外,我们学习Spring也是围绕着它如何存放和取出数据的;那么什么是IoC呢?下面详细介绍!

Spring官网

 我们可以通过Spring | Home这个URL区访问Spring官网(Java程序员必须知道的URL),在Spring官网中我们可以详细的了解到Spring的一些历史以及版本更新,用的最多的是《Projects》这个标签,在这个标签栏下面可以看见有关Spring的一些其他框架,这些框架都是基于Spring的,所以学习Spring有助于我们更好的去使用其他框架!

二,什么是IoC

IoC思想

IoC = Inversion of Control(控制反转),结合上面的定义,Spring就是一个“控制反转”的容器;很多人看完这个定义后,直接懵了,什么是控制反转?下面通过一个代码案例来演示控制反转的含义(假如,现在需要构建一辆“车”的程序,实现思路如下:构建⼀辆车(Car Class),然而车需要依赖车身(FrameWork Class),而车身需要依赖底盘(Bottom Class),而底盘需要依赖轮胎(Tire Class)),代码如下:

//Car类

public class Car {
    private Framework framework;
    
    public Car() {
        framework = new Framework();
        framework.init();
    }

    public void init() {
        System.out.println("doCar!");
    }

    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

//Framework类
public class Framework {
    private Bottom bottom;

    public Framework() {
        bottom = new Bottom();
        bottom.init();
    }

    public void init() {
        System.out.println("doFramework!");
    }
}

//Bottom类

public class Bottom {

    private Tire tire;

    public Bottom() {
        tire = new Tire();
        tire.init();
    }

    public void init() {
        System.out.println("doBottom!");
    }
}


//Tire类

public class Tire {
    private int size = 15;

    public Tire() {

    }

    public void init() {
        System.out.println("size: " + size);
    }



执行结果如下:

我们在Tire类中设置了轮胎的尺寸(size)是15,如果此时我们需要更换需求,需要这个size是一个可变的,不同的用户想要不同的size,或者说想要给车添加一个颜色的属性,此时该怎么做?(此时我们需要在Tire的构造方法中传入size,这样就可以根据用户的需求进行轮胎的设计了),但是每一个类都依赖另一个类,最底层的Tire类进行了构造方法的修改,会发现上层的类都会报错:

  缺陷上述代码存在于传统的开发中,代码的耦合度很高,当最底层代码改动之后,整个调⽤链上的所有代码都需要修改;IoC应运而生,IoC作为一种指导思想就是为了解决代码的耦合性,具体实现思想为:只需要将原来由自己创建的下级类改为传递的方式(也就是注入的方式),因为我们不需要在当前类中创建下级类了,所以下级类即使发生变化(创建或减少参数),当前类本身也无需修改任何代码,这样就完成了程序的解耦!

//Car类

public class Car {
    private Framework farmework;

    //framework由Spring提供 开发人员不需要关注
    public Car(Framework farmework) {
        this.farmework = farmework;
    }

    public void init() {
        System.out.println("do car...");
        farmework.init();
    }
}

//Framework类

public class Framework {
    private Bottom bottom;

    //bottom由Spring提供 开发人员不需要关注
    public Framework(Bottom bottom) {
        this.bottom = bottom;
    }

    public void init() {
        System.out.println("do framework...");
        bottom.init();
    }
}

//Bottom类

public class Bottom {
    private Tire tire;

    //tire由Spring提供 开发人员不需要关注
    public Bottom(Tire tire) {
        this.tire = tire;
    }

    public void init() {
        System.out.println("do bottom...");
        tire.init();
    }
}

//Tire类

public class Tire {
    //添加了size和color属性
    private int size;
    private String color;

    public Tire(int size,String color) {
        this.size = size;
        this.color = color;
    }

    public void init() {
        System.out.println("size = " + size + " color = " + color);
    }
}

//Test类 

/**
 * Test类用来进行数据测试
 */
public class Test {
    public static void main(String[] args) {
        Tire tire = new Tire(15,"红色");
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
}

 控制权的反转

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire

改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
上述就是控制权的反转!
从测试类Test中的main方法中也可以看出来控制权的反转,最先new的Tire类,最后new的Car类

 

 
Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒。

 三,什么是DI

DI的定义

上面详细讲解了什么是IoC,那么与之对应的就是DI(Dependency Injection),意思是依赖注入;所谓依赖注入,就是由IoC容器在运行期间,动态的将某种依赖关系注入到对象之中

DI和IoC的关系

依赖注⼊(DI)和控制反转(IoC)是从不同的角度的描述的同⼀件事情,就是指通过引⼊入IoC 容器,利用依赖关系注⼊的方式,实现对象之间的解耦;IoC 是“⽬标”也是⼀种思想,而目标和思想只是⼀种指导原则,最终还是要有可行的落地方案,而DI就属于具体的实现。

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

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

相关文章

ABP vNext电商项目落地实战(一)——项目搭建

一、落地条件: 1. .NET5版本 2. DDD 3. ABP vNext 4.ABP CLI (ABP的命令行工具,包括ABP的各种模板) 5.SQL Server 写在前面:我觉得这个框架的文件分层很凌乱,在企业的实际业务场景中,一般…

vscode+git浅尝

git 安装git以后初始化仓库分支重命名合并分支连接远程仓库推送项目 安装git以后 第一次使用git需要配置用户名和邮箱 任意处打开git终端,譬如鼠标右击点击git bash here 命令分别为: 设置用户名和邮箱 git config --global user.name “username” …

【QA】Python代码调试之解决Segmentation fault (core dumped)问题

Python代码调试之解决Segmentation fault 问题 问题描述排查过程1. 定位错误,2. 解决办法 参考资料 问题描述 Python3执行某一个程序时,报Segmentation fault (core dumped)错,且没有其他任何提示,无法查问题。 Segmentation fa…

jenkins gitlab asp.net core持续集成

什么是jenkins Jenkins直接取自其官方文档,是一个独立的开源自动化服务器,您可以使用它来自动执行与构建、测试、交付或部署软件相关的各种任务。 jenkins可以干什么 Jenkins 通过自动执行某些脚本来生成部署所需的文件来工作。这些脚本称为JenkinsFi…

叶酸聚乙二醇羟基FA-PEG-OH;了解高分子试剂 Folate-PEG-OH

FA-PEG-OH,叶酸-聚乙二醇-羟基 中文名称:叶酸聚乙二醇羟基 英文名称:FA-PEG-OH HO-PEG-FA Folate-PEG-OH 性状:黄色液体或固体,取决于分子量 溶剂:溶于水,DMSO、DMF等常规性有机溶剂 活性基…

【NestJs】使用连接mysql企业级开发规范

本篇将介绍如何建立 NestJs 的数据库连接、并使用数据库联表查询。 简介 Nest 与数据库无关,允许您轻松地与任何 SQL 或 NoSQL 数据库集成。根据您的偏好,您有许多可用的选项。一般来说,将 Nest 连接到数据库只需为数据库加载一个适当的 No…

Delphi DataSnap 流程分析(一)

DataSnap 有三种方式: 1、DataSnap REST Application: Create a DataSnap Server with support for REST Communication and with pages that invoke server methods using Java Script and JSON. 2、DataSnap Server: The DataSnap Server Wizard provides an easy way to i…

怎么把视频中动态的人物P掉,把视频中不要的人物去掉

怎么把视频中动态的人物P掉?很多小伙伴试过ps抠图,但是你试过视频人物抠图吗?其实道理是一样的,但是操作过程却变难了。今天就给大家带来一个简单的方法,轻松去除视频中的人物。不影响整个画面的呈现。 在拍摄旅游视频…

springcloud:快速上手定时任务框架xxl-job(十五)

0. 引言 实际开发中,我们常常遇到需要定时执行的任务,我们可以利用定时线程池或schedule框架等来实现定时任务,但这些方式都有效率、性能上的缺陷,在微服务框架下,我们期望一种更加规整、轻量、可靠的定时任务框架来帮…

【通信接口】UART、IIC、SPI

目录 一、预备知识 1、串行与并行 2、单工与双工 3、波特率 二、UART 三、IIC 四、SPI (一对一、一对多) 五、IIC、SPI异同点 参考文章:这些单片机接口,一定要熟悉:UART、I2C、SPI、TTL、RS232、RS422、RS485…

kafka-5 kafka的高吞吐量和高可用性

kafka的高吞吐量和高可用性 6.1 高吞吐量6.2 高可用(HA) 6.1 高吞吐量 kafka的高吞吐量主要是由4方面保证的: (1)顺序读写磁盘 Kafka是将消息持久化到本地磁盘中的,一般人会认为磁盘读写性能差&#xff…

【C++ 八】写文件、读文件

写文件、读文件 文章目录 写文件、读文件前言1 文本文件1.1 写文件1.2 读文件 2 二进制文件2.1 写文件2.2 读文件 前言 本文包含文本文件写文件、文本文件读文件、二进制写文件、二进制读文件。 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通…

中间表示- 活性分析

进行活性分析的动机 (1)在代码生成的讨论中,我们曾假设目标机器有无限多个(虚拟)寄存器可用,这简化了代码生成的算法,但对物理机器是个坏消息,因为机器只有有限多个寄存器&#xff…

Spring Boot 应用的打包和发布

1. 创建项目(example-fast) 基于 Spring Boot 创建一个 WEB 项目 example-fast。 2. 编译打包 2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包,可谓是超级 easy 2.2 mvn 命令打包 # mvn clean 清理编译 # install 打包 #…

牛顿法、梯度下降法与拟牛顿法

牛顿法、梯度下降法与拟牛顿法 0 引言1 关于泰勒展开式1.1 原理1.2 例子 2 牛顿法2.1 x 为一维2.2 x 为多维 3 梯度下降法4 拟牛顿法4.1 拟牛顿条件4.2 DFP 算法4.3 BFGS 算法4.4 L-BFGS 算法 0 引言 机器学习中在求解非线性优化问题时,常用的是梯度下降法和拟牛顿…

数据结构入门(C语言版)二叉树概念及结构(入门)

二叉树概念及结构(入门) 树的概念及结构1.树的概念及结构1.1 树的概念1.2 树的相关知识1.3 树的结构体表示1.4 树的实际运用 2.二叉树概念及结构2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 结语 树的概念…

【SpringCloud】3、使用Nacos作为服务配置中心

1、增加 maven 依赖 <!-- SpringCloud Alibaba Nacos Config --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>2、添加配置中心配置 spr…

(数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换

文章目录 一&#xff1a;Radon变换&#xff08;1&#xff09;Radon变换原理&#xff08;2&#xff09;Radon变换实现&#xff08;3&#xff09;Radon变换性质&#xff08;4&#xff09;Radon变换应用 二&#xff1a;小波变换&#xff08;1&#xff09;小波A&#xff1a;定义B&a…

【PyQt】PyQt5进阶——串口上位机及实时数据显示

文章目录 0 前期教程1 前言2 串口部分——QtSerialPort3 绘图部分3.1 QCustomPlot3.2 QtChart3.3 QWT3.4 Qt Designer中如何使用 参考链接 0 前期教程 【Python】PyQt5入门 1 前言 最近在用PyQt做一个串口上位机&#xff0c;需要串口通信和实时显示曲线。这里简单记录一些关键…

【已解决】最简单便捷的方法将多html合并为pdf

一、单页面转pdf 可以使用pdf24&#xff0c;https://tools.pdf24.org/zh/webpage-to-pdf。 也可以直接打印 二、多页面转pdf&#xff08;wkhtmltopdf方案&#xff09; 1、安装配置pdfkit&#xff1a;[https://blog.csdn.net/xc_zhou/article/details/80952168(https://blog.…