复习Spring与SpringBoot的时候,遇到了概念上的疑惑,现根据一些博客上的信息写下自己对Spring IOC容器、Servlet容器、HTTP请求到响应过程方面的理解。

1、应用上下文(ApplicationContext)是Spring IOC容器表现形式之一,另一个是BeanFactory。

2、BeanFactory是应用上下文的父接口,应用上下文是BeanFactory的高级表现形式。Spring中启动程序就是启动容器的过程,而Web应用是建立上下文的过程。

3、Spring IOC容器的作用:对Bean组件创建、管理、销毁、DI。

4、Spring MVC中上下文有三种:分别是ServletContext、WebApplicationContext、mlWebApplicationContext。

1)首先、Web应用部署在Web容器中(如Tomcat),Web容器启动时即初始化ServletContext作为一个全局环境。

2)之后、监听器ContextLoaderListener监听到Web容器启动后触发的容器初始化事件,随即调用ContextInitialized方法。

3)ContextInitialized方法中,建立WebApplicationContext根上下文,其管理着web.xml中被context-param标签标记的所有bean对象。建立了WebApplicationContext根上下文后会以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE作为该根上下文的属性key与根上下文组成entry一起保存到ServletContext中。结束了根上下文初始化后开始初始化web.xml中servlet标签标记着的Servlet(如DispatchServlet),每个Servlet初始化期间都会建立一个自己的IOC容器---mlApplicationContext,用于持有与Spring MVC相关的bean。这些mlApplicationContext都以根上下文WebApplicationContext为父上下文,共用一组Bean。最后再根据每个mlApplicationContext对象中与容器相关的特定属性作为属性key与对应mlApplicationContext上下文组成entry存储在ServletContext中以便后续使用。

4)至此,Web应用的三种上下文建立过程与关系描述完毕,自己画了个图如下所示

容器启动服务pid 为1_容器启动服务pid 为1

5、Servlet容器用来处理客户请求,当客户发送请求时,选择调用某一Servlet并将Servlet执行结果返回给客户端,结果默认以字符串形式传给客户端,客户端可以解析成JSON进行处理

6、Servlet容器相当于在Spring容器覆盖下,Servlet容器通过Spring容器获得所需要的Bean

7、Spring对HTTP请求响应过程

请求报文信息HttpInputMessage传入项目,由HttpMessageConverter转换器接收后转换为Java对象,再通过SpringMVC中控制器对请求与数据进行处理(可能会被filter/interceptor过滤掉/拦截掉),最后将处理结果数据通过原路响应。

在SpringBoot中,因为Web模块自动配置了HttpMessageConverter,所有中间部分对于我们普通使用者来说透明

下图转自:中的插图

容器启动服务pid 为1_Web_02