引用:

什么是Spring Boot

我们先要了解一下相关概念

  • Spring MVC/Struts与servlet
  • Spring Framework与Spring Boot

Spring MVC

  • 了解SpringMVC前最好了解他的底层servlet,这里有很重要的一点servlet(服务器小程序)并不是一个很复杂的东西。事实上,servlet就是一个Java接口,是一套处理网络请求的规泛。和客户端打交道的是servlet的容器,如tomcat。
  • Servlet接口定义了Servlet与servlet容器之间的契约。Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
  • 用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
  • 对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象(由容器通过init方法传递)。

spring 如何使用 servlet的?

  1. 当Servlet容器启动时,ServletContext对象被初始化,然后Servlet容器调用web.xml中注册的监听器(ContextLoaderListener实现ServletContextListener)的
    public void contextInitialized(ServletContextEvent event)方法
  2. 而在监听器中,调用了this.initWebApplicationContext(event.getServletContext())方法,在这个方法中实例化了Spring IOC容器。即ApplicationContext对象。
  3. 因此,当ServletContext创建时我们可以创建applicationContext对象,当ServletContext销毁时,我们可以销毁applicationContext对象。这样applicationContext就和ServletContext“共生死了”。

那么SpringMVC在servlt的基础上干了什么呢?

我个人的感觉,SpringMVC与其说是一套框架,更像是一种优雅的设计方式。
Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。

  • 模型(Model):封装了应用程序的数据,通常由POJO类组成
  • 视图(View):负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出
  • 控制器(Controller):负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染

DispatcherServlet组件类 Spring MVC框架是围绕DispatcherServlet设计的,它处理所有的请求和响应。Spring MVC DispatcherServlet的工作流程:
springmvc

  1. 接受HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller(根据请求的url)
  2. Controller接受请求并根据请求的类型Get/Post调用相应的服务方法,服务方法进行相应的业务处理,并设置模型数据,最后将视图名称返回给DispatcherServlet
  3. DispatcherServlet根据返回的视图名称从ViewResolver获取对应的视图
    DispatcherServlet将模型数据传递到最终的视图,并将视图返回给浏览器。

关于上下文

  • https://blog.csdn.net/tongdanping/article/details/102840060 (可参考)
  • WebApplicationContext继承了ApplicationContext接口,是ApplicationContext的扩展,它增加了WEB应用特性,还可以视图解析、主题解析、映射,通过ServletContext与servlet关联 ,WebApplicationContext被绑定在ServletContext上(通过ContextLoaderListener绑定),可以通过RequestContextUtils获取WebApplicationContext。
  • ApplicationContext 是 spring 中较高级的容器。和 BeanFactory 类似,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。 另外,它增加了企业所需要的功能,比如,从属性文件从解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。
  • ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactory,ApplicationContext 会被推荐使用。BeanFactory 仍然可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。
    最常被使用的 ApplicationContext 接口实现:
  1. FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
  2. ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
  3. WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。