| |
|
开发:
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()这个方法 ?在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容器的加载入口
? Spring容器加载bean的过程入口:wac.refresh();?接下来加载spring容器中bean 2、接着启动刷新SpringMVC容器该功能主要由FrameworkServlet类的createWebApplicationContext方法实现 ? ? ? ?三、处理@RequestMapping注解,建立url和方法的关系????????上面提的关系就是<url,controller(中的方法)>Map结构。这一步是在SpringMVC容器初始化过程中完成。 分为三个步骤 ?springmvc中配置这个标签<mvc:annotation-driven></mvc:annotation-driven> 默认注册三个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结构中 四、初始化DispatcherServletDispatcherServlet继承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 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |