Spring概述及IoC,DI的理解

目录

一、Spring 是什么?

1.1 什么是容器?

1.2 如何理解IoC?

1.3 理解Spring Ioc

1.4 DI是什么

1.5 回顾IoC,DI

1.6 IoC和DI的对比


一、Spring 是什么?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景,它可以让 Java 企业级的 应用程序开发起来更简单。

⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器。也就是说Spring最核心的功能就是容器管理。

1.1 什么是容器?

容器是用来容纳某种物品的基本装置。就好比Map与List属于数据存储的容器,Tomcat属于Web容器,同理,作为IoC容器的Spring,它包含了许多方法和工具。

1.2 如何理解IoC?

IoC的英文全称为:Inversion of Control 翻译成中文为 ”控制反转“的意思。它的核心思想是将程序的控制权从调用者转移到被调用者的组件或者框架中,从而实现框架的解耦和可扩展性。

代码举例 

这里我们以汽车为例:它包含车身,底盘,轮胎等。我们造一辆汽车时,需要有车身,而车身需要有轮胎,对传统程序开发来说:造车的时候需要车身,于是就new一个车身,而车身需要底座,于是就new一个底座,同理,就new一个轮胎。

像Car类与Framework类这种的依赖关系在日常开发中也是常见的,比如前后端分离模式下的前端代码的实现,也是需要依赖于后端的所提供的一些接口的,如果仅只有前端,那么数据将无法持久化的保存。

Car类:

public class Car {
    private Framework framework;
    //既然车是依赖于车架的,所以我们需要在构造方法中new它。
    public Car() {
        framework = new Framework();
    }
    public void init() {
        System.out.println("do car");

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

Framework类:

public class Framework {
    private Bottom bottom;
    public Framework() {
        bottom = new Bottom();
    }
    public void init() {
        System.out.println("do framework");
        bottom.init();
    }
}

Bottom类:

public class Bottom {
    private Tire tire;
    public Bottom() {
        tire = new Tire();
    }
    public void init() {
        System.out.println("do bottom");
        tire.init();
    }
}

Tire类:

public class Tire {
    private int size = 18;

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

代码运行结果:

 传统程序开发缺陷

以上程序中,轮胎的尺寸是固定的,这显然并不符合日常生活的逻辑,因为人们的需求是多种多样的。于是我们需要将其进行修改(可以传递轮胎的尺寸):

从以上代码可以看出,当底层的代码改动之后,整个调用链上的所有代码都需要进行修改(如果在Bottom中的):

虽然这时候可以满足需求:

但是需要对整个调用链上的所有代码进行修改,显然不合适。

 解决传统开发中的缺陷

为了解决这一缺陷,我们可以根据IoC的思想,将控制权交出去,换句话说,需要轮胎Tire类时,

你给我传一个Tire对象,我不去new一个Tire对象了,这一的话,就算Tire类加参数也只需要修改Tire类的构造方法与相关执行方法,属性等,这就很好的降低了耦合度,起到了解耦的作用。

这种将一个对象所需要的依赖关系从对象本身中抽离出来,交给外部容器来管理和注入的方式交做依赖注入。

改动后的代码:

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

于是可以得到IoC有以下优点:

对象(bean)的生命周期交给其他(一般为Spring)来维护,作为程序员,无需关注(对象的创建和销毁时机),这些工作都交给Spring来完成。

1.3 理解Spring Ioc

既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功
能:

  • 将对象存⼊到容器
  • 从容器中取出对象

Spring是一个IoC容器,意思其实是将对象的创建和销毁的权利交给Spring来管理,而本身又具备存储对象和获取对象的能力。

根据以上:我们可以得出Spring IoC的优点如下,

  1. 简化代码:Spring IoC 可以帮助我们自动管理对象的创建和依赖注入,从而简化了代码,减少了不必要的重复代码和样板代码。

  2. 降低耦合性:Spring IoC 可以将组件之间的依赖关系解耦,从而提高了代码的可维护性和可扩展性,使得程序更加灵活和适应变化。

1.4 DI是什么

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。

所谓的依赖注入,就是由IoC容器在运行期间,动态的将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述同一件事情。

举个例子:

在开发的过程中,DI主要体现在prom.xml的引入依赖中:

1.5 回顾IoC,DI

IoC全称Inversion of Control,把创建对象的权力交给容器,对象的实例不是由调用者来创建,而是由容器来创建,容器会负责控制程序之间的关系,而不是由调用者的程序代码来控制。这样,控制权由应用代码转移到了容器,控制权发生了反转,这就是控制反转,它是Spring框架的核心思想之一。

DI全称Dependecy injection ,当某个Java实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由Spring容器来完成,然后注入到调用者之中,因此称为依赖注入。

1.6 IoC和DI的对比

IoC和DI其实是从不同的角度来描述同一概念,IoC是一种思想,而思想是需要一个方案来落实的,DI就是这个方案。
 


 

猜你喜欢

转载自blog.csdn.net/qq_63218110/article/details/130132066