【Spring 源码学习】IOC 容器简介与学习规划

401 阅读5分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。


一。前言

  • 上一篇我们对 Spring 框架进行了一个简单的概述;
  • 了解到 Spring 框架的两大核心:IOC 和 AOP;
  • 源码分析首先学习 Spring 框架的 IOC 容器,之后再来 AOP;
  • 本篇,先了解一下什么是 IOC 容器,以及后续 IOC 容器部分学习规划;

二,控制反转-IOC(Inversion of Control)

1,常规方式创建对象

  • 正常情况下,多个类相互配合工作,在入口类通过 new 来创建所依赖的对象实例(持有引用);

2,控制反转创建对象

  • 控制反转,是将需要的对象预先创建出来放到容器中;
  • 当需要对象引用时,向容器申请并由容器注入到对象中,即依赖注入;

3,控制反转,反转了什么?

  • 所谓控制反转(也叫依赖反转),其实是依赖对象的获得被反转了,所以也被称作依赖注入;
  • 应用控制反转后,当对象被创建时,由一个 IOC 容器将依赖对象注入到对象中;
  • 所以,控制反转是关于一个对象如何获取它所依赖对象的引用,这里的反转指的是责任的反转;

4,控制反转(IOC)和依赖注入(DI)

  • 控制反转(IOC):指的是容器控制对象;
  • 依赖注入(DI):指的是对象需要依赖容器来获得;
  • 所以说 IOC 和 DI 是同一思想下不同维度的表现;

5,常规方式和控制反转的对比-控制反转的优点

  • 常规方式下:由入口类主动创建依赖对象,这导致代码高度耦合并降低了代码的可测试性;
  • 依赖反转:将对象的依赖注入交给容器完成,解耦代码的同时提高了代码的可测试性;

6,设计模式的应用

  • 设计原则中包含一条"好莱坞"原则,即控制反转;

  • 好莱坞原则:“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”;

  • 这一点,在 IOC 上得到了完美体现,IOC 注重的是设计思想,从常规创建对象的做法(new对象),转变为向IOC容器提交申请,被动等待IOC容器返回资源;

  • 模板方法模式,充分的体现了“好莱坞”原则;


三,Spring 的 IOC 容器

有了控制反转和依赖注入的基础,再来认识一下 Spring 的 IOC 容器:

  • 在 Spring 框架中,IOC 容器是控制反转模式实现的载体;
  • IOC 容器是具有依赖注入功能的容器,是可以创建对象的容器;
  • IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖;
  • 通过依赖注入在容器创建对象后,处理对象的依赖关系;

1,为什么使用 IOC 容器

  • 将面向对象系统中的对象进行分类,除了一部分是数据外,大多数对象是用来处理数据的;

  • 这些对象是系统中的基础部分且不常变化,所以这些对象以单件形式就可以满足应用需求;

  • 同时,这些对象间的依赖关系也比较稳定,一般不会随应用的运行状态而改变;

  • 基于以上特性,这些对象非常适合由 IOC 容器进行管理;

2,IOC 容器的优点

  • IOC 容器将对象的依赖关系有序地建立起来;
  • 通过使用IOC容器,对象依赖关系的管理被反转到了IOC容器中;
  • 对象之间的相互依赖关系由IOC容器进行管理,并由IOC容器完成对象的注入;
  • 简化了对象依赖关系的管理,把应用从复杂的对象依赖关系管理中解放出来;

3,IOC 容器的注入方式

IOC 容器,可以在对象生成或初始化时直接将数据注入到对象中;
也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖;
这种依赖注入是可递归的,对象被逐层注入;

注入方式:

  • 接口注入-不推荐,违背Spring离开框架也能活的非侵入式设计原则
  • setter注入(推荐)
  • 构造器注入
  • 注解方式注入(推荐)

Spring IOC 容器提供了对特定依赖的检查,以防止注入异常;


4,IOC 容器学习大纲

学习 Spring IOC 容器,首先我们先列出一个学习大纲:

  • IOC容器的结构体系

    分析 IOC 容器的接口继承关系及不同接口的功能实现,如 BeanFactory 定义IOC最基本功能;

  • IOC 容器实现

    Spring所提供的多种IOC实现,如:xmlBeanFactory 和 ApplicationContext;

  • IOC 容器的初始化过程

    IOC容器初始化都做了些事?如:资源定位、Bean 的载入、解析、注册等;

  • IOC 容器的依赖注入

    容器初始化完成后,什么时候发生依赖注入?如何实现的注入?

  • IoC 容器 lazy-init 预实例化的实现

  • BeanFactory 的实现

  • BeanPostProcessor 后置处理器的实现

  • 自动装配 autowiring 的实现

  • Bean 的依赖检查

  • Bean 感知 IOC 容器

目前暂时只想到这些,更新过程中会有适当的变更和细化,随时更新