初识Spring - 什么是IoC容器?

目录

一、Spring是什么?

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

 2. IoC的优点 (解决耦合问题)

二、什么是Spring IoC

1. Spring IoC详解

(1)也就是学习 Spring 最核心的功能:

(2)将对象存放到容器中的好处:

(3)为什么Spring是一个IoC容器:

2. 什么是DI(Dependency Injection)


前言

     从这篇文章开始进入EE进阶的学习,内容就是学习一些企业主流的框架,首先学习框架的意义就在于可以高效的开发项目,高效就是框架最大的优势,框架也是更易用的。首先来说EE初阶学习的 servlet 其实和主流的 Spring-Boot 框架相比是有很多的不方便的地方:

1. 添加外部jar包不方便,必须要外部的jar包版本是匹配的

2. 运行和调试需要配置tomcat

3. 发布 servlet 项目需要依靠tomcat(外置web容器)运行
4. 路由配置不方便,一个访问地址对应一个 Servlet 类等等

    但是如果是一个Spring-Boot项目,此时就没有servlet的痛点。所以,学习如何高效的做出项目是很有必要的。

一、Spring是什么?

    Spring值得是 Spring Framework(Spring框架),它是开源的框架,支持广泛的应用场景,可以让Java企业的应用程序开发更简单高效。

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

容器  就是用来容纳物品的一个装置。在之前的文章中也有提到,向Java集合框架中的List,Map,这就是存储数据的一个容器,还有Tomcat就Web容器。
IoC (Inversion of Control)我们需要把它翻译成 ”控制权的反转“ 的一个容器,我们可以用一个场景来解释什么是控制权的反转:有一个A对象和B对象,此时如果要使用B对象,要依赖B对象才可以使用,所以此时就需要在A对象中 new 一个B对象,也就是说 A对象控制着B对象的生命周期,用到了就去创建它,不用了就把它销毁

    但是此时如果在代码层次就有很大的问题:耦合,所谓的耦合就是A对象依赖B对象才能使用,如果B对象的构造方法改了,或者是加了参数,或者是减少了参数,此时A对象也要跟着B对象一起改变,此时的代码就称为 "高耦合"。  但是开发要求的代码是 "高内聚,低耦合"的,不能是一个代码模块改变之后,其他调用链上的代码都要跟着一起改变。

    控制权的反转的意思就是A对象不控制B对象的生命周期了,在使用A对象的时候只是给A对象传一个类似参数的东西(B对象),至于B对象的控制权交给哪个对象来控制,此时A是不关心的,所以此时就发生了一个控制(权)的反转,如下图:

 2. IoC的优点 (解决耦合问题)

    如果现在需要在程序中造一辆车,首先就有一个车身,地盘,轮胎,所以造车的时候,车是依赖于车身的,车身又依赖于地盘,此时依赖关系,如下代码:

package IoC;

public class Car {
    private Framework framework;
    public void init() {
        System.out.println(" do car");
        framework = new Framework();
        framework.init();
    }
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}
package IoC;

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

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

public class Tire {
    private int size = 17;
    public void init() {
        System.out.println("size ->" + size);
    }
}

    此时的轮胎的size是固定大小的,但是我如果需要一个别的尺寸的轮胎就需要在init方法中传一个size的参数,如下代码:

     但是在init方法中传入一个参数之后,此时有依赖关系的调用链中的所有的代码都有问题了,都需要改这个参数, Tire类的init方法中有了参数,Bottom类中就需要传一个参数,Bottom类中传了参数之后,Framework类中又有问题了......

     但是如果是控制权反转了,不再在car类中控制framework的生命周期,只是在需要使用的时候传这样的一个参数,此时就不会再出现耦合的现象了,如下代码:

     所以从上述代码来看:

传统的 new 对象的方式创建顺序: Car  -->  Framework  -->  Bottom -->  Tire 

IoC类的创建顺序:Tire  -->  Bottom --> Framework  -->  Car

    此时就发生了控制权的反转,代码经过上述调整,无论底层咋变化,整个程序调用链是不会做出改变的,这样就完成了代码之间的解耦,从而更加灵活,通用的设计程序了。这也就是IoC实现的思想。

二、什么是Spring IoC

1. Spring IoC详解

    既然Spring是一个IoC(控制反转)容器,重点还在 容器 身上,只要它是一个容器,此时就又两个最基本的功能:

1. 将对象存入到容器中
2. 从容器中取出对象使用

(1)也就是学习 Spring 最核心的功能:

     学习如何 将对象存到Spring中,再从Spring中获取对象的过程。

(2)将对象存放到容器中的好处:

     将对象存储在IoC容器中相当于将以后可能用到的所有工具制作好放到仓库中,需要的时候直接取即可,用完再将对象放回i仓库中,而 new 对象的方式就相当于每次需要工具的时候才开始做,用完了就扔掉,也不会进行保存,下次再使用的时候还得重新做。

这就是IoC容器和普通开发程序的区别。

(3)为什么Spring是一个IoC容器:

     指的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。

2. 什么是DI(Dependency Injection)

    DI 翻译成中文就是 "依赖注入" 的意思,所谓依赖注入就是 IoC 的一种具体的实现方式,就是由IoC容器在运行期间,动态将某种依赖关系注入到对象中,也就是指通过引入IoC容器,利用依赖关系注入的方式,来实现对象和对象之间的解耦。(IoC是一种思想,而DI就属于具体的实现方式)

    而具体是如何在代码层次实现的 DI 会在下一篇文章 Spring 的创建和使用中详解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良月初十♧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值