【图解Springboot】IOC那些事儿(一)ApplicationContext的变化

1,708 阅读3分钟

关于源码解析的文章,我感觉阅读学习的效率并不高。没有脑图来的实在,自顶向下自行学习,能大大增加学习效率。【图解Springboot】系列文章只放干货,不说废话。图片仅供收藏,转载请标明出处,谢谢各位小伙伴!

源码思维导图

学习IOC之前,我们需要先搞明白什么是Spring容器。

Spring容器一代目

1.什么是Spring容器?

  Spring容器是Spring的核心,一切SpringBean都存储在Spring容器内部,实现依赖注入,并由其管理Bean的生命周期。

注意: Spring容器并不仅仅是一个容器,而是有很多个容器,Spring容器仅仅是多个容器在概念上的统称。 又或者说Spring容器存在多种实现

2.Spring容器的分类

Spring自带多个容器的实现,这些容器大致可以分为2种类型:

  • BeanFactory(Bean工厂) 是最简单的容器,提供基本的DI支持
  • ApplicationContext(应用上下文)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件中解析文本信息以及发布应用事件给感兴趣的事件监听者

  通常BeanFactory是底层的实现,功能和方法很少,大部分场景仅仅是用于Spring框架的底层支持。对于业务开发者来说,BeanFactory能够提供的服务实在是少之又少,所以基本开发中,我们都是使用ApplicationContext来实现业务需求

3.核心接口

spring时代的Spring容器只有三个非常重要的接口:

  • BeanFactory IOC容器
  • ApplicationContext 非Web应用的根应用上下文
  • WebApplicationContext Web应用的根应用上下文接口

SpringBoot时代的变化

当进入SpringBoot时代,因为得益于SpringBoot自带嵌入式的Servlet容器,所以底层的设计也发生了一些变化。因为SpringBoot 2.x 出现了开发模式的分类,核心接口也出现了变化。

因为SpringBoot使用的是嵌入式Servle容器,Servlet容器不再是外部应用,而是作为SpringBoot项目中的一个子组件的存在。所以在SpringBoot项目启动过程中,SpringBoot容器的启动和初始化是优先于Servlet容器的,Servlet容器的初始化是由Spring容器来操控的,这一点明显与Spring时代不一样。

核心接口:

SpringSpringBoot1.xSpringBoot2.x
BeanFactoryBeanFactoryBeanFactory
ApplicationContextApplicationContextApplicationContext
WebApplicationContextWebApplicationContextWebApplicationContext
WebServerApplicationContext

实现类:

xml开发SpringSpringBoot1.xSpringBoot2.x
Web应用XmlWebApplicationContextXmlEmbeddedWebApplicationContextXmlServletWebServerApplicationContext
非Web应用ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
不变不变
注解开发SpringSpringBoot1.xSpringBoot2.x
Web应用AnnotationConfigWebApplicationContextAnnotationConfigEmbeddedWebApplicationContextAnnotationConfigServletWebServerApplicationContext
非Web应用AnnotationConfigApplicationContext不变不变
WebFluxAnnotationConfigReactiveWebServerApplicationContext

结论:所以对于SpringBoot的另起炉灶,我们只用关注ApplicationContext接口的子接口WebServerApplicationContext就可以了

总结

Spring:

传统Spring中自带了多种类型的应用上下文 ,如下是常见的:

  • AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spring应用上下文,Spring配置注解开发使用
  • AnnotationConfigWebApplicationContext 从一个或多个基于Java的配置类中加载Spring Web应用上下文,Spring配置注解开发中使用
  • ClassPathXmlApplicationContext 从类路径下的一个或多个XML配置文件中加载上下文定义
  • FileSystemXmlApplicationContext 从文件系统下的一个或多个XML配置文件中加载上下文定义
  • XmlWebApplicationContext 从Web应用下的一个或多个XML配置文件中加载上下文定义

SpringBoot 1.X :

  • AnnotationConfigEmbeddedWebApplicationContext替代AnnotationConfigWebApplicationContext作为WebApplicationContext的默认实现类,因为以前的WebApplicationContext的初始化是由Servelt容器完成的,而SpringBoot中Spring容器初始化优先于Servlet容器

  • XmlEmbeddedWebApplicationContext替代XmlWebApplicationContext


SpringBoot 2.X :

引入了一个新接口:WebServerApplicationContext

他的两个实现类分别是:

  • ReactiveWebServerApplicationContext(WebFlux)

  • ServletWebServerApplicationContext(SpringMvc)

对应子类:

  1. xml开发使用XmlServletWebServerApplicationContext
  2. 注解开发使用AnnotationConfigServletWebServerApplicationContext
  3. AnnotationConfigReactiveWebServerApplicationContextReactiveWebApplicationContext的实现类,跟传统MVC的WebApplicationContext是同级不同编程模式的Spring容器