栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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配置中由将spring的配置文件引入加载到web容器中,

配置项是在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和方法的关系

        上面提的关系就是Map结构。这一步是在SpringMVC容器初始化过程中完成。

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

 springmvc中配置这个标签

默认注册三个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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号