引用:
- https://blog.csdn.net/qq_19782019/article/details/80292110
- https://juejin.cn/post/6844903570681135117
- https://blog.csdn.net/tuoni123/article/details/79899061
什么是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的?
- 当Servlet容器启动时,ServletContext对象被初始化,然后Servlet容器调用web.xml中注册的监听器(ContextLoaderListener实现ServletContextListener)的
public void contextInitialized(ServletContextEvent event)方法 - 而在监听器中,调用了this.initWebApplicationContext(event.getServletContext())方法,在这个方法中实例化了Spring IOC容器。即ApplicationContext对象。
- 因此,当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的工作流程:
- 接受HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller(根据请求的url)
- Controller接受请求并根据请求的类型Get/Post调用相应的服务方法,服务方法进行相应的业务处理,并设置模型数据,最后将视图名称返回给DispatcherServlet
- 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 接口实现:
- FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
- ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
- WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。