前言
之前写过一篇《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容器的创建 ,并在代码中配置加载Spring容器启动的配置文件,以及调用Spring容器的加载入口
this.configureAndRefreshWebApplicationContext(cwac, servletContext);
Spring容器加载bean的过程入口:wac.refresh(); 接下来加载spring容器中bean
2、接着启动刷新SpringMVC容器该功能主要由frameworkServlet类的createWebApplicationContext方法实现
三、处理@RequestMapping注解,建立url和方法的关系 上面提的关系就是
分为三个步骤
1.遍历注解:SpringMVC容器初始化过程中,具体在创建RequestMappingHandlerMapping类实例时,对标注了@Controller或@RequestMapping注解的类中方法进行遍历。
springmvc中配置这个标签
默认注册三个bean:RequestMappingHandlerMapping,RequestMappingHandlerAdapter,DefaultHandlerExceptionResolver
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



