Bootstrap

Spring IOC:IOC在Spring底层中如何实现?

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6
spring版本:5.3.1



Spring系列专栏文章目录


一. 什么是IOC?

IOC,英文全称为Inversion of Control,意为反转控制。不是什么新的开发技术,而是一种开发设计思想

我们都知道在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

这里的组件是什么?

在Spring框架中,组件(Component)是指可以被Spring容器管理和配置的对象,包括Java类和Bean等。

反转控制的思想完全颠覆了上述的传统方式:即反转了资源的获取方向,变成容器主动的将资源推送给需要的组件开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。

在这里插入图片描述

例如,当我们突然想吃红烧狮子头这道菜,传统的方式是我们自己去菜市场买菜,购置并准备烹饪这道菜的原材料,调料与烹饪工具,自己动手做这道菜。而使用IOC的思想来看,就是我们去饭馆吃饭,点上红烧狮子头这道菜,让饭馆给我们做,我们不需要准备这道菜的原材料和做法。这有点类似面向对象的设计思想–“我不做,我让你去做”


二. IOC在spring中的实现

我们都知道spring框架中的核心部分是“IOC”思想,即控制反转。当应用程序启动时,spring容器会帮助开发者去创建相应的对象,注意是spring容器在创建对象,并将需要的依赖关系在运行时注入到对象中,这个依赖关系的注入过程就被称为依赖注入【DI】

那什么是依赖关系?

用通俗的话来说,就是“我需要你,所以我依赖于你,我和你是依赖关系;而你是独立的,可以不需要我”,比如,我们中国人吃饭,都是拿筷子夹菜,扒饭吃。在这一现象中,我们在吃饭的过程中需要用到筷子,我们依赖于筷子,而筷子不需要依赖谁。ok,我们和筷子构成了依赖关系。在Java程序中,可以这样设计,将我们中国人提取抽象为一个ChinesePerson类,筷子也抽象为chopsticks类,ChinesePerson类需要用到筷子,可以把chopsticks类【筷子】作为它的成员属性。

依赖注入,谁注入谁?注入了什么?

IOC容器会注入应用程序依赖的对象,注入依赖的对象它所需要的外部资源(包括对象、资源、常量数据),比如基于上面的案例情景中,IOC容器会在ChinesePerson类为它的成员属性注入它所依赖的对象,即chopsticks类的对象。

2.1 在spring底层中,IOC如何实现?

它主要通过BeanFactory和ApplicationContext两个接口来实现

2.1.1 BeanFactory与ApplicationContexet接口

  • BeanFactoryIOC容器的基本实现,是Spring内部的使用接口,它主要负责创建并管理bean对象,是面向Spring本身的,并不提供给开发人员 使用的
  • ApplicationContextBeanFactory的子接口,它提供了更多的高级特性支持,例如AOP与事务传递机制等等。它是面向Spring的使用者,几乎所有场合都能使用它

2.1.2 IOC类的图解

在这里插入图片描述

  • BeanFactory接口:Springl底层IOC实现【面向Spring框架】
    • ApplicationContext子接口:面向程序员
      • ConfigurableApplicationContext子接口:提供关闭或刷新容器对象方法
        • ClassPathXmlApplicationContext:基于类路径检索xml文件【推荐这种】
        • FileSystemXmlApplicationContext:基于文件系统检索xml文件
;