第一章:普通容器

1.1 生活中的普通容器

生活中的普通容器.jpg

  • 生活中的容器只能用来存储东西,没有更多的功能(难道好看也是一种功能?)。

1.2 程序中的普通容器

  • ① 数组。
  • ② 集合:List 、Set 、Map等。

第二章:复杂容器

2.1 生活中的复杂容器

生活中的复杂容器.png

  • 政府管理我们的一生,生老病死和政府息息相关。

2.2 程序中的复杂容器

  • Servlet 容器能够管理 Servlet 、Filter 、Listener 这些组件的一生,所以其是一个复杂的容器。我们要学习的 IOC 容器也是一个复杂的容器,它们不仅负责 创建 组件的对象、存储 组件的对象,还要负责 调用 组件的方法让其工作,并在一定的情况下 销毁 组件。
  • Servlet 的生命周期: | 名称 | 时机 | 次数 | | —- | —- | —- | | 创建对象 | 默认情况:接收到第一次请求 修改启动顺序后:Web应用启动过程中 | 一次 | | 初始化操作 | 创建对象之后 | 一次 | | 处理请求 | 接收到请求 | 多次 | | 销毁操作 | Web应用卸载之前 | 一次 |

  • Filter 的生命周期: | 生命周期阶段 | 执行时机 | 执行次数 | | —- | —- | —- | | 创建对象 | Web应用启动时 | 一次 | | 初始化 | 创建对象后 | 一次 | | 拦截请求 | 接收到匹配的请求 | 多次 | | 销毁 | Web应用卸载前 | 一次 |

第三章:IOC 思想

3.1 概念

  • IOC(Inversion of Control):控制反转。

3.2 获取资源的传统方式

  • 自己做饭:买菜、洗菜、择菜、切菜、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节并且需要熟练掌握。
  • 在应用程序中的组件需要获取资源的时候,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下,开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时也降低了开发效率。

3.3 获取资源的控制反转方式

  • 点外卖:下单、等待、吃外卖,省时省力,不必关心资源创建过程的全部细节。
  • 控制反转的思想完全颠覆了应用程序组件获取资源的传统方式,反转了资源获取的方向—改由容器主动将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发效率,这种行为称为查找的被动方式。

3.4 DI

  • DI(Dependency Injection):依赖注入。
  • DI 是 IOC 的另一种表述形式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于 IOC 而言,这种表述更直接。

3.5 总结

  • IOC 就是一种控制反转的思想, 而 DI 是对 IOC 的一种具体实现。

第四章:IOC 容器在 Spring 中的实现

  • Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做bean。在创建 bean 之前,首先需要先创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:
  • ① BeanFactory:BeanFactory 是 IOC 容器的基本实现,是 Spring 内部使用的接口,面向 Spring 本身,不提供给开发人员使用。
  • ② ApplicationContext:BeanFactory的子接口,提供了更多的特性,面向 Spring的使用者,几乎所有的场合都使用ApplicationContext 而不是底层的 BeanFactory。

    我们以后在 Spring 的环境下看到一个类或接口的名称中包含 ApplicationContext,基本上可以推断,这个类或接口和 IOC 容器相关。

BeanFactory的类图.png

类型名 简介
ClassPathXmlApplicationContext 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
ConfigurableApplicationContext ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。
WebApplicationContext 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。