IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringMVC原理 -> 正文阅读

[Java知识库]SpringMVC原理

? ? ? ?前言

????????之前写过一篇《springMVC执行流程》的文章springMVC执行流程_张狂年少-CSDN博客

当时想着写点不一样的东西出来,最终还是落了俗套,写的东西感觉还是纯概念,经过一段时间的积累,这里再补充一篇关于springmvc原理方面的文章,顺着自己理解的思路来梳理,争取给学习springmvc的初学者一种豁然开朗的感觉。

? ? ? ? 一、servlet、tomcat、springmvc介绍

1、servlet

????????servlet是java?Web 应用服务器,也是java?Web 应用服务器的规范,tomcat就是基于servlet规范实现的Web 应用服务器

2、tomcat

????????tomcat就是基于servlet规范实现的Web 应用服务器

3、springmvc

????????Spring MVC?是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet

二、Tomcat如何启动两个容器—Spring容器、SpringMVC容器

1、先启动刷新Spring容器

????????要想了解spring容器在web容器中启动的过程,首先我们需要知道web容器在tomcat中的生命周期,方可理解spring容器是如何在web容器中启动、运行、以及销毁的生命周期

????????tomcat在启动web容器的时候会启动一个叫ServletContextListener的监听器,每当在web容器中有ServletContextListener这个接口被实例化的时候,web容器会通知ServletContextListener被实例的对象去执行其contextInitialized()的方法进行相应的业务处理,而spring框架在设计的过程中ContextLoadListener这个类实现了ServletContextListener这个接口,因此每当有ContextLoadListener这个类被实例化的时候,web容器会通知他执行contextInitialized()这个方法
一般来讲spring MVC在web.xml在的配置如下:

?在web.xm配置中由<context-param>将spring的配置文件引入加载到web容器中,

<listener>配置项是在web容器中启用监听,其所配置的class是需要启用的监听器,因此spring容器的启用是同过org.springframework.web.context.ContextLoaderListener进行spring容器的启动,而ContextLoaderListener监听实现的是ServlectContextListener接口,因此在其实例化的过程中,contextInitialized()会被调用,从而进行spring容器的启动与创建的过程中ContextLoaderListener中的contextInitialized()进行了spring容器的启动配置并且刷新实例化整个SpringApplicationContext中的Bean。因此,如果我们的Bean配置出错的话,在容器启动的时候,会抛异常出来的

以上完成Spring容器的创建 ,并在代码中配置加载Spring容器启动的配置文件,以及调用Spring容器的加载入口

this.configureAndRefreshWebApplicationContext(cwac, servletContext);

?

 

Spring容器加载bean的过程入口:wac.refresh();?接下来加载spring容器中bean

2、接着启动刷新SpringMVC容器

该功能主要由FrameworkServlet类的createWebApplicationContext方法实现

? ? ? ?三、处理@RequestMapping注解,建立url和方法的关系

????????上面提的关系就是<url,controller(中的方法)>Map结构。这一步是在SpringMVC容器初始化过程中完成。

分为三个步骤
1.遍历注解:SpringMVC容器初始化过程中,具体在创建RequestMappingHandlerMapping类实例时,对标注了@Controller或@RequestMapping注解的类中方法进行遍历。

?springmvc中配置这个标签<mvc:annotation-driven></mvc:annotation-driven>

默认注册三个bean:RequestMappingHandlerMapping,RequestMappingHandlerAdapterDefaultHandlerExceptionResolver

?RequestMappingHandlerMapping

?我们看它实现了InitializingBean?接口,所以在getBean()实例化它时会执行afterPropertiesSet()方法

方法中实例化了一个BuilderConfiguration对象,并为该对象设置了一些路径抓取器,路径方法匹配器等。最后还需要调用父类的方法

?父类只是调用了initHandlerMethods()方法,该方法很关键是将请求路径和方法匹配的

?

2.封装RequestMappingInfo实例:将类和方法上的**@RequestMapping注解值进行合并,封装成一个RequestMappingInfo实例**。以controller中的方法对象为key,对应的RequestMappingInfo实例为value存入map中,遍历map开始注册

3.注册到Map中:将这个Controller实例、方法及方法参数信息封装到HandlerMethod中。以RequestMappingInfo为key,HandlerMethod为value存储到map结构。将url(@RequestMapping注解value值)为key,以RequestMappingInfo为value存到map结构中

四、初始化DispatcherServlet

DispatcherServlet继承FrameworkServlet,FrameworkServlet继承了HttpServletBean,HttpServletBean继承了HttpServlet,通过使用Servlet API 来对HTTP请求进行响应,成为SpringMVC的前端处理器?

初始化时序图

?注:作为Servlet,DispatcherServlet的启动和Servlet的启动相关联。在Servlet初始化过程中,Servlet的init方法会被调用,以进行初始化,DispatcherServlet作为基类,初始化从HttpServletBean中的初始化过程开始。

????????DispatcherServlet的工作分为2部分,一部分是初始化(也就是图的上半部分),有initServletBean()启动,通过initWebApplicationContext()方法最终调用DispatcherServlet中的initStrategies()方法。另一部分(也就是图的下半部分),是对HTTP请求进行响应,作为Servlet,Web容器会调用Servlet的doGet()和doPost()方法,在经过FrameworkServlet的processRequest()简单处理后,会调用DispatcherServlet的doService方法,在这个方法调用中封装了doDispatch(),继续调用processDispatchResult方法返回调用信息?

五、总结

至此springmvc原理分析完成,其中省略了部分代码,可以根据这篇博文结合源码去理解。

比较关键的几点是:

1)Tomcat如何启动两个容器—Spring容器、SpringMVC容器

2)处理@RequestMapping注解,建立url和方法的关系

3)初始化DispatcherServlet

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 07:59:26  更:2021-11-25 08:01:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:51:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码