源码思维导图
学习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时代不一样。
核心接口:
Spring | SpringBoot1.x | SpringBoot2.x |
BeanFactory | BeanFactory | BeanFactory |
ApplicationContext | ApplicationContext | ApplicationContext |
WebApplicationContext | WebApplicationContext | WebApplicationContext |
WebServerApplicationContext |
实现类:
xml开发 | Spring | SpringBoot1.x | SpringBoot2.x |
Web应用 | XmlWebApplicationContext | XmlEmbeddedWebApplicationContext | XmlServletWebServerApplicationContext |
非Web应用 | ClassPathXmlApplicationContext FileSystemXmlApplicationContext | 不变 | 不变 |
注解开发 | Spring | SpringBoot1.x | SpringBoot2.x |
Web应用 | AnnotationConfigWebApplicationContext | AnnotationConfigEmbeddedWebApplicationContext | AnnotationConfigServletWebServerApplicationContext |
非Web应用 | AnnotationConfigApplicationContext | 不变 | 不变 |
WebFlux | 无 | 无 | AnnotationConfigReactiveWebServerApplicationContext |
结论:所以对于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)
对应子类:
- xml开发使用
XmlServletWebServerApplicationContext
- 注解开发使用
AnnotationConfigServletWebServerApplicationContext
-
AnnotationConfigReactiveWebServerApplicationContext
是ReactiveWebApplicationContext
的实现类,跟传统MVC的WebApplicationContext
是同级不同编程模式的Spring容器