SpringIOC解析


文章简概

  1. 什么是 IOC/DI?

  2. Spring ioc的体系结构

    1. BeanFactory
    2. BeanDefinition
  3. IOC 容器的初始化

    1. XmlBeanFactory 整个流程
    2. FileSystemXml ApplicationContext IOC的容器流程
  4. IOC解剖

    1. 设置资源加载器和资源定位
    2. AbstractApplicationContext的refresh函数载入Bean定义过程
    3. AbstractApplicationContext子类的refreshBeanFactory()方法
    4. AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法
    5. AbstractBeanDefinitionReader读取Bean定义资源

    ….


    先不讲那么多,我们先来聊聊SpringIOC中的IOC是什么

    IOC是什么

    IOC 全英文为Inversion of Control翻译后就是控制反转,他并不是一种技术,只是我们在设计程序的时候一种思想!在开发中IOC以为着你设计好的对象交给Spring的这个容器去控制,而不是在普通的对象内部进行控制!

    IOC如何理解?

    理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”

    我们现在来开始深度解剖:

    谁控制谁,控制什么

    传统的Java SE程序设计中,我们直接在对象通过new xx进行我们的对象创建,是程序主动创建我们的依赖对象;但我们IOC的不同之处就在于此,即为IOC控制对象的create;

    那这里的谁控制谁的答案自然就出现了!

    Spring IOC 控制对象!

    控制什么对象?

    IOC主要控制了我们的外部资源的获取!(不仅限于对象)

    例如:文件,图片等

    为何是反转,哪些方面反转了:

    有反转必然用顺应,传统应用程序中使我们自己在对象内部主动控制去自动获取依赖对象,也就是顺应方式!而反转则是由容器来帮忙创建及注入依赖对象;

    简单的看一下图示:

    image-20210111105517075

    当我们有的IOC/DI容器之后,我们就没有必要再主动创建这些对象了

    image-20210111105950121

IOC可以做些什么

一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

IoC(控制反转)

首先想说说IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

DI(依赖注入)

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

IOC容器

IOC容器用来管理Bean的创建,装配等,同时管理所有这些Bean的生命周期,主要有两个:BeanFactory和ApplicationContext这两个接口。


First: BeanFactory:IOC容器的基本实现(再生产环境中不会用到)

它的主要用处用于:

①配置,创建以及管理Bean对象;
②维护Bean之间的依赖关系;
③负责Bean对象的生命周期;

Second:ApplicationContext(调用上下文)

提供了很多高级属性,是我们上文BeanFactory的一个子接口(非常常用)并且其在初始化上下文时就实例化所有单例的 Bean!

主要类:

ClassPathXmlApplicationContext:

从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件作为类资源;
FileSystemXmlApplicationContext:读取文件系统下的XML配置文件并加载上下文定义;
XmlWebApplicationContext:读取Web应用下的XML配置文件并装在上下文定义;
通过现有应用上下文引用ApplicationContext,可以调用应用上下文的getBean()方法从Spring容器中获取Bean;

总结一下applicationContext的作用:

①读取Bean定义文件;
②维护Bean之间的依赖关系;
③国际化的支持;
④资源访问;
⑤事件传播;
⑥多配置文件加载


图像见解其SpringIOC的运行流程:

image-20210111112010305


实战内容请见下期!


文章作者: icbug
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 icbug !
评论
  目录