您现在的位置是:首页 >其他 >Spring核心思想网站首页其他

Spring核心思想

哔卟哔卟_: ) 2024-09-17 00:01:05
简介Spring核心思想

?Spring是什么


通常所说的 Spring 指的是 Spring Framework(Spring 框架)

Spring
是包含了众多工具方法的 IOC 容器

  • 将众多工具方法的 IOC 容器拆解为三部分
    • 众多工具方法
    • IOC
    • 容器

众多工具方法

  • 将扳手?理解为一个工具
    • 扳手?可以用来打螺丝(方法)
    • 扳手?可以用来敲核桃(方法)

容器

  • 将水杯理解为容器
    • 可以用水杯装水
    • 可以用水杯装果汁
    • 可以用水杯装牛奶

IOC(Inversion Of Control)


IOC(Inversion Of Control)控制反转

控制反转的内容是啥?
对象的生命周期

为什么需要控制反转?(控制反转的作用)
解耦合

举个栗子?

现在需要编写一段代码来模拟实现一辆"车"?

  • 划分为4个部分
    • 轮胎
    • 底座
    • 车身

在这里插入图片描述

实现思路?

定义Car类

public class Car {
    private Framework framework;

    public Car() {
        framework = new Framework();
    }

    public void init() {
        framework.init();
    }
}

定义Framework类

public class Framework {
    private Bottom bottom;

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

    public void init() {
        bottom.init();
    }
}

定义Bottom类

public class Bottom {
    private Tyre tyre;

    public Bottom() {
        tyre = new Tyre();
    }

    public void init() {
        tyre.init();
    }
}

定义Tyre类

public class Tyre {
    private int size = 20;

    public Tyre() {

    }

    public void init() {
        System.out.println("执行 Init() 方法, 轮胎的尺寸为 : " + this.size);
    }
}

定义启动类

public class Application {

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

}

可以看到, 上述代码描述的"车"的轮胎大小是固定的
如果需要修改轮子的大小, 就需要对代码进行改动

  • 两种方式
    • 传统实现思路
    • IOC实现思路

传统实现思路?

定义Car类

public class Car {
    private Framework framework;

    public Car(int size) {
        framework = new Framework(size);
    }

    public void init() {
        framework.init();
    }
}

定义Framework类

public class Framework {
    private Bottom bottom;

    public Framework(int size) {
        bottom = new Bottom(size);
    }

    public void init() {
        bottom.init();
    }
}

定义Bottom类

public class Bottom {
    private Tyre tyre;

    public Bottom(int size) {
        tyre = new Tyre(size);
    }

    public void init() {
        tyre.init();
    }
}

定义Tyre类

public class Tyre {
    private int size = 20;

    public Tyre(int size) {
        this.size = size;
    }

    public void init() {
        System.out.println("执行 Init() 方法, 轮胎的尺寸为 : " + this.size);
    }
}

定义启动类

public class Application {

    public static void main(String[] args) {
        int size = 12;

        Car car = new Car(size);
        car.init();
    }

}

IOC实现思路?

定义Car类

public class Car {
    private Framework framework;

    public Car(Framework framework) {
        this.framework = framework;
    }

    public void init() {
        framework.init();
    }
}

定义Framework类

public class Framework {
    private Bottom bottom;

    public Framework(Bottom bottom) {
        this.bottom = bottom;
    }

    public void init() {
        bottom.init();
    }
}

定义Bottom类

public class Bottom {
    private Tyre tyre;

    public Bottom(Tyre tyre) {
        this.tyre = tyre;
    }

    public void init() {
        tyre.init();
    }
}

定义Tyre类

public class Tyre {
    private int size = 20;

    public Tyre(int size) {
        this.size = size;
    }

    public void init() {
        System.out.println("执行 Init() 方法, 轮胎的尺寸为 : " + this.size);
    }
}

定义启动类

public class Application {
    
    public static void main(String[] args) {
        Tyre tyre = new Tyre(30);
        Bottom bottom = new Bottom(tyre);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
    
}

对比传统实现思路与IOC实现思路?

在这里插入图片描述

控制反转的内容是啥?

  • 传统实现思路
    • 自己控制对象的生命周期
    • this.tyre = new Tyre(size);
  • IOC实现思路
    • 将对象生命周期的控制权转交给他人(控制反转, 自己控制 → 他人控制)
    • this.tyre = tyre;

为什么需要控制反转?(控制反转的作用)

  • 传统实现思路
    • 对车子的需求修改时, 需要对每个方法都进行修改(耦合度较高)
  • IOC实现思路
    • 对车子的需求修改时, 只需要修改对应的方法即可(解耦合)

在这里插入图片描述

A类引用B类, B类引用C类, C类引用D类…

传统实现思路是 new
但这样的实现耦合度较高(当被引用的类的构造方法发生变化, 则整个调用链都需要进行改变)

IOC(控制反转)
不再 new, 而是传入当前对象
此时的调用链仍然是A类引用B类, B类引用C类, C类引用D类…
但当D发生改变时, 整个调用链的代码不用全部进行修改, 从而解决了耦合度较高的问题
在这里插入图片描述

Spring的基本功能


Spring 的本质是一个容器
容器的基本功能有两个

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

举个栗子?

水杯是一个容器

  • 用水杯来存水(将对象存入到容器)
  • 喝水杯中的水(从容器中取出对象)

谈一谈IOC与DI


IOC(Inversion Of control)控制反转
将对象的生命周期托管给他人

DI(Dependency Injection)依赖注入
在程序运行期间, 动态的将某个对象引入到当前的一种机制

public Bottom(Tyre tyre) {
    this.tyre = tyre;
}

以这段代码为例

  • 将对象的生命周期托管给他人(IOC, this.tyre = new Tyre() → this.tyre = tyre)
  • 在程序运行期间, 将 tyre 引入到当前(DI)

IOC 与 DI 没有本质上的区别, 只是从不同的角度来去描述同一个问题

  • IOC 侧重的是想法
  • DI 侧重的是具体的实现

举个栗子?

我今天中午想去外面吃(IOC → 想法)
我去外面吃了隆江猪脚饭(DI → 具体实现)

?结尾

创作不易,如果对您有帮助,希望您能点个免费的赞?
大家有什么不太理解的,可以私信或者评论区留言,一起加油

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。