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 → 具体实现)

🔎结尾

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

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值