Spring 核心与设计思想

目录

1. Spring 是什么

1.1 什么是容器

1.2 什么是 IoC

1.2.1 传统程序开发

1.2.2 控制反转式程序开发

1.2.3 对比总结规律

 1.3 DI 概念说明


1. Spring 是什么

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞 大的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器。

1.1 什么是容器

容器是用来容纳某种物品的装置。
例如:
spring ->Ioc容器
List / Map ->数据存储容器
Tomcat -> Web 容器

1.2 什么是 IoC

IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器。
下面理解“控制反转”

1.2.1 传统程序开发

以构造车为例:
⼀辆完整的汽⻋,如果所有的配件都是⾃⼰造,那么当客户需求发⽣改变的时候,⽐如轮胎的尺⼨不再是原来的尺⼨了,那我们要⾃⼰动⼿来改了。
public class NewCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }

    /**
     * 汽车对象
     */
    static class Car {
        public void init() {
            // 依赖车身
            Framework framework = new Framework();
            framework.init();
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        public void init() {
            // 依赖底盘
            Bottom bottom = new Bottom();
            bottom.init();
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {

        public void init() {
            // 依赖轮胎
            Tire tire = new Tire();
            tire.init();
        }
    }

    /**
     * 轮胎类
     */
    static class Tire {
        // 尺寸
        private int size = 30;

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

 当客户需要增加车身颜色时,每一个类都要进行改变,就很麻烦,如下,每个类都需要增加String color,传入变量也需要增加

public class NewCarExample2 {
    public static void main(String[] args) {
        NewCarExample2.Car car = new NewCarExample2.Car();
        car.init(50,"粉色");
    }

    /**
     * 汽车对象
     */
    static class Car {
        public void init(int size,String color) {
            // 依赖车身
            NewCarExample2.Framework framework = new NewCarExample2.Framework();
            framework.init(size,color);
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        public void init(int size,String color) {
            // 依赖底盘
            NewCarExample2.Bottom bottom = new NewCarExample2.Bottom();
            bottom.init(size,color);
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {

        public void init(int size,String color) {
            // 依赖轮胎
            NewCarExample2.Tire tire = new NewCarExample2.Tire();
            tire.init(size,color);
        }
    }
    static class Tire {
        // 尺寸

        public void init(int size,String color) {
            System.out.println("轮胎尺寸:" + size + "| 车身颜色: " + color );
        }
    }
}

 通过程序的实现代码,类的创建顺序是反的,传统代码是Car 控制并创建 Framework,Framework 创建并建Bottom ,依次往下,有上级对象创建并控制下级对象

1.2.2 控制反转式程序开发

基于以上思路,我们把调⽤汽⻋的程序示例改造⼀下,把创建⼦类的⽅式,改为注⼊传递的⽅式,具体实现代码如下:

public class IocCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(40, "红色");
        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;
        }

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

    static class Framework {
        private Bottom bottom;

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

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

    static class Bottom {
        private Tire tire;

        public Bottom(Tire tire) {
            this.tire = tire;
        }

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

    static class Tire {
        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 + " | 颜色:" + color);
        }
    }
}

 改进之后的控制权发生的控制权发生的反转,又下级对象把注入当前对象中,下级的控制权不在由上级类控制,这样即使下级类发生任何改变,当前类都是不受影响,这就是典型的控制反转,也就是IoCde 实现思想。

代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了。

1.2.3 对比总结规律

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存 储对象和获取对象的能⼒。
Spring IoC 容器最核心的功能
1.将Bean (对象) 存储到 Spring(容器)中。
2. 将Bean (对象) 从 Spring(容器)中取出来。

 1.3 DI 概念说明

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依
赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容
器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI 就属于具体的实现。

猜你喜欢

转载自blog.csdn.net/m0_60494863/article/details/125716215