Spring~什么是Spring? Spring最核心的功能?什么是IoC?什么是DI?有什么区别?

我们之前学习了Servlet,大体了解了服务器端代码的开发流程,Servlet可以理解为是一种框架,但Servlet使用起来有很多的不方便,每次需要自己配置Tomcat,不能快速的引入依赖和添加jar包等,所以现在主流的框架不使用Sevlet,而使用Spring.

什么是Spring?

Spring指的是Spring Framework(Spring 框架),它是一个开源框架,有非常活跃和庞大的社区支持,Spring支持广泛的应用场景,可以让Java企业级开发更简单。

用一句话概括Spring:Spring是包含众多工具方法的IoC容器。

Spring框架中有很多模块,如Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test等其他模块,通过使用这些模块可以大幅度的提升开发效率。
现在使用较多的、比较新的框架是Spring Boot.SpringBoot是Spring的进阶和扩展,Spring是SpringBoot的基础。

上面讲到Spring是一种容器,那什么是容器呢?

什么是容器?

容器就是用来容纳某种东西的基本装置。
之前 我们已经接触过一些容器,比如
List/Map—数据储存容器
Tomcat–web容器

我们这里学习的Spring也是一个容器,而且是一个IoC容器

什么是IoC?

IoC=inversion of Control(控制反转),这是一种设计思想,并不是具体的技术。控制反转即将我们设计好的对象交给容器控制,而不是由我们直接控制。这种控制和管理对象的容器也就是IoC容器。

举例,比如我们创建一个构建“汽车”的程序,需要有一个Car类,然后在Car类中创建车身Framework,在底盘中创建底盘Bottom,在底盘中创建轮胎Tire类。通常情况下,我们都是这种设计思想,类与类之间进行调用。

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);
       }
   }
}

这种设计的缺陷就是,如果我们想要获得不同尺寸的轮胎,不仅需要修改底层的轮胎类,还需要修改整个调用链上的类,这非常的不方便。为了避免这种情况,我们采用IoC的设计思想,不在类中创建需要使用的类,而是直接注入。

public class IocCarExample {
    
    
    public static void main(String[] args) {
    
    
        Tire tire = new Tire(20);
        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;
        public Tire(int size) {
    
    
            this.size = size;
       }
        public void init() {
    
    
            System.out.println("轮胎:" + size);
       }
   }
}

这样就发生了反转,我们先创建轮胎类,然后将其注入给底盘,底盘注入给车身类,车身注入给Car,如果轮胎的大小发生改变,我们只需要改变底层的轮胎类,而不需要再修改整个调用链,这种思想就是IoC

IoC的设计思想有什么作用?

IoC的设计思想可以降低代码之间的耦合性,也就是代码之间的关联程度,进而设计出松耦合、更优良的代码。传统的程序设计都是我们在类中主动创建依赖对象,进而使用这个对象的一些资源,这就导致了类与类之间高耦合,难于测试。在IoC的设计思想下,我们将创建和管理对象的权限交给容器,由容器进行注入和组合对象,所以对象和对象之间、类和类之间是松散耦合、便于功能复用,也方便测试,也会将我们的代码结构体系变得非常灵活。

什么是DI?

DI:Dependency Injection,依赖注入。
依赖注入是IoC设计思想的具体实现手段,具体实现技术.

即由IoC容器动态的将某个依赖关系注入到某个组件之中。就比如类A需要连接数据库,通常情况下我们是创建一个Connection对象,而依赖注入就是不需要我们创建,我们直接告诉容器 ,类A需要一个Connection对象,容器就会在程序运行的过程中,动态的将这个Conection对象给注入到类A中,这个对象是何时创建、何时销毁都不由我们决定,而是由容器自行决定。

DI的实现其实依赖了Java的一个重要特性:反射(reflection)。它允许程序在运行的时候动态的生成对象、执行对象的方法、修改对象的属性。

依赖注入可以提升组件运行的效率,为系统搭建一个灵活的、可扩展的平台。

IoC vs DI?

IoC是控制反转,它是一种设计思想,而DI是依赖注入,是控制反转的实现手段。

Spring最核心的功能?

Spring最核心的功能就是管理对象,动态的将对象注入Spring框架当中,然后再给取出来。

猜你喜欢

转载自blog.csdn.net/Merciful_Lion/article/details/123870193