springmvc源码分析

Spring容器启动源码解析

倾然丶 夕夏残阳落幕 提交于 2019-12-02 08:45:35
1. 前言   最近搭建的工程都是基于SpringBoot,简化配置的感觉真爽。但有个以前的项目还是用SpringMvc写的,看到满满的配置xml文件,却有一种想去深入了解的冲动。折腾了好几天,决心去写这篇关于Spring启动的博客,自己是个刚入职的小白,技术水平有限,也是硬着头皮看源码去Debug,很多不懂的地方还请谅解! 2. 概述   先给出几个让我头皮发麻的概念: web容器,Spring容器,SpringMvc容器   容器就是管理对象的地方,例如web容器就是管理servlet的地方,Spring容器就是管理Service,dao等Bean的地方,SpringMvc就是管理Controller等bean的地方(下文会做解释)。一个SpringMvc项目的启动离不开上述三个容器。所以这就是这篇文章的讲点,各个容器的启动过程解析。 3. Web容器初始化过程    官方文档是对于Web容器初始化时是这样描述的(英文不懂,已翻译成中文)   1. 部署描述文件(web.xml)中的<listener>标记的监听器会被创建和初始化   2. 对于实现了ServletContextListener的监听器,会执行它的初始化方法 contextInitialized()   3. 部署描述文件中的<filter>标记的过滤器会被创建和初始化,调用其init()方法   4.

自己实现一个简化版的SpringMVC框架

戏子无情 提交于 2019-12-02 01:43:35
  废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用。SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实现了MVC模式。想要实现自己的SpringMVC框架,需要从以下几点入手: 一、了解SpringMVC运行流程及九大组件 二、梳理自己的SpringMVC的设计思路 三、实现自己的SpringMVC框架 一、了解SpringMVC运行流程及九大组件 1、SpringMVC的运行流程 ⑴ 用户发送请求至前端控制器DispatcherServlet ⑵ DispatcherServlet收到请求调用 HandlerMapping处理器映射器 。 ⑶ 处理器映射器 根据请求url找到具体的处理器 ,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 ⑷ DispatcherServlet通 过HandlerAdapter处理器适配器 调用处理器 ⑸ 执行 处理器(Controller,也叫后端控制器 )。 ⑹ Controller执行完成返回ModelAndView ⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet ⑻

SpringMVC加载WebApplicationContext源码分析

百般思念 提交于 2019-11-30 02:52:36
Spring框架提供了构建Web应用程序的全功能MVC模块,叫Spring MVC,通过Spring Core+Spring MVC即可搭建一套稳定的Java Web项目。本文通过Spring MVC源码分析介绍它的核心实现原理。 Tomcat服务器启动入口文件是web.xml,通过在其中配置相关的 Listener和Servlet 即可加载Spring MVC所需数据。基于Spring MVC最简单的配置如下。 <!-- 加载Spring配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-context*.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 加载spring mvc --> <servlet> <servlet-name>spring3mvc</servlet-name> <servlet-class>org.springframework.web.servlet

Spring源码解析 - springMVC核心代码

孤街醉人 提交于 2019-11-29 07:33:00
一、首先来讲解下springMVC的底层工作流程   1、首先我们重点放在前端控制器(DispatcherServlet)   其类图:   因为从流程图看,用户的请求最先到达就是DispatcherServlet。他是springmvc的核心,也是中央出处理器。因此我们分析源码,先看看他是什么样的流程:通过源码可看到:他是继承FrameworkServlet,它也是springmvc提供的类,继续往下继承关系看,FrameworkServlet继承HttpServletBean,她依旧是spring提供的.最终直到他继承HttpServlet,如代码: public class DispatcherServlet extends FrameworkServlet {} public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware {} public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware {}   而这个类他就是servlet。因此既然是Servlet类,那么他有一个最终的方法

SpringMVC源码分析和启动流程

社会主义新天地 提交于 2019-11-29 05:08:59
https://yq.aliyun.com/articles/707995 在Spring的web容器启动时会去读取 web.xml 文件,相关启动顺序为: <context-param> --> <listener> --> <filter> --> <servlet> ,具体为: 1、解析 <context-param> 键值对 2、创建一个application对象即ServletContext,servlet上下文,用于全局共享 3、将 <context-param> 键值对放入ServletContext中,web应用全局共享 4、读取 <listener> 标签,创建监听器,一般使用 ContextLoaderListener ,如果使用了 ContextLoaderListener ,Spring就会创建一个WebApplicationContext对象,这个就是 IOC容器 , ContextLoaderListener 创建的 IOC容器 是全局共享的,并将其放在 ServletContext 中, 键名为 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE , 读取 web.xml 文件里的 contextConfigLocation 配置中的xml文件来创建bean 5

SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller

梦想与她 提交于 2019-11-28 12:56:20
SpringMVC是目前主流的Web MVC框架之一。 我们使用浏览器通过地址 http://ip:port/contextPath/path进行访问,SpringMVC是如何得知用户到底是访问哪个Controller中的方法,这期间到底发生了什么。 本文将分析SpringMVC是如何处理请求与Controller之间的映射关系的,让读者知道这个过程中到底发生了什么事情。 本文实际上是在上文基础上,深入分析 HandlerMapping里的 HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception; 该方法的具体实现,包括它如何找到对应的方法,以及如何把结果保存在map里,以便让请求转发到对应的handler上,同时也分析了handleradaptor具体做了什么事情。 源码分析 在分析源码之前,我们先了解一下几个东西。 1.这个过程中重要的接口和类。 HandlerMethod类:   Spring3.1版本之后引入的。 是一个封装了方法参数、方法注解,方法返回值等众多元素的类。      它的子类InvocableHandlerMethod有两个重要的属性WebDataBinderFactory和HandlerMethodArgumentResolverComposite,

SpringMVC源码分析3:DispatcherServlet的初始化与请求转发

旧城冷巷雨未停 提交于 2019-11-28 12:55:43
在我们第一次学Servlet编程,学java web的时候,还没有那么多框架。我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转到我们定义好的jsp页面。Servlet类编写完之后在web.xml里注册这个Servlet类。 除此之外,没有其他了。我们启动web服务器,在浏览器中输入地址,就可以看到浏览器上输出我们写好的页面。为了更好的理解上面这个过程,你需要学习关于Servlet生命周期的三个阶段,就是所谓的“init-service-destroy”。 以上的知识,我觉得对于你理解SpringMVC的设计思想,已经足够了。SpringMVC当然可以称得上是一个复杂的框架,但是同时它又遵循Servlet世界里最简单的法则,那就是“init-service-destroy”。我们要分析SpringMVC的初始化流程,其实就是分析DispatcherServlet类的init()方法,让我们带着这种单纯的观点,打开DispatcherServlet的源码一窥究竟吧。 配置元素读取 用Eclipse IDE打开DispatcherServlet类的源码,ctrl+T看一下。 DispatcherServlet类的初始化入口方法init()定义在HttpServletBean这个父类中

SpringMVC 源码解析

不羁岁月 提交于 2019-11-28 05:34:51
前言 年初面试时接触到一道面试题,在聊到SpringMVC时提到了SpringMVC的开发者为何要设计父子容器呢,又或者说是父子容器的设计有什么更实际的作用呢? 首先要理解对于一个web应用,当期部署在web容器上时,容器会为其提供一个全局上下文环境ServletContext,这个上下文环境将为后续的Spring提供宿主环境。 SpringMVC工作流程 DispatcherServlet上下文继承关系 SpringMVC设计的父子容器 父子容器配置文件 --在web.xml中配置,两个重要的xml:applicationContext.xml和SpringMVC-conf.xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applictionContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher-servlet</servlet

Spring全家桶之springMVC(一)

与世无争的帅哥 提交于 2019-11-27 03:23:35
     Spring MVC简介和第一个spring MVC程序        Spring MVC是目前企业中使用较多的一个MVC框架,被很多业内人士认为是一个教科书级别的MVC表现层框架,Spring MVC是大名鼎鼎的Spring框架在3.0版本之后的新增的一个模块,可以与Spring无缝集成,在使用起来比较方便。除此之外,Spring MVC还具备极强的可配置性,提供了强大的数据验证功能,支持RESTful风格等等一系列的特性,因此掌握Spring MVC框架的知识已经成为各大软件开发公司对应聘者的一个硬性要求。          Spring MVC简介     Spring MVC有些地方也叫作Spring Web MVC,看名字就能知道这是一个表现层框架。在没有学习Spring MVC或者struts之类的框架的时候,一般会使用JavaEE中的servlet来接收和处理前台发送的请求,这种方式使用起来有一些不方便的地方,比如做一个增删改查,我们需要在servlet中编写判断逻辑来处理相应的增删改查的请求,这样代码显得冗余,而且不同的开发者可能会有不同的写法,在实际开发中当一个项目大到一定程度之后,需要将一些重复冗余的代码抽象出来,此时你就会发现,这些代码其实就是java常用的那些框架的原型。这些框架抽象了一些冗余代码,还提供了一些好用的类和方法,因此在实际开发中

SpringMVC入门程序实战

徘徊边缘 提交于 2019-11-26 12:28:55
基本概念 三层架构 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。下面介绍一下每层负责的功能。 表现层 web层,负责接收客户端(比如浏览器)的请求,向客户端响应结果。通常客户端使用 http协议请求web 层, web 需要接收 http 请求,完成 http 响应。 表现层又分为控制层和展示层。 控制层:负责接收请求 展示层:负责结果的展示 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。表现层的设计一般都使用 MVC 模型。( MVC 是表现层的设计模型,和其他层没有关系) 业务层 service层,负责业务逻辑处理,实现开发需求。web层依赖业务层,但业务层不依赖web层。 如果要对数据持久化需要保证事务一致性,在业务处理时,依赖持久层。 持久层 dao层。负责数据持久化,包括数据层(数据库)和数据访问层。持久层就是和数据库交互,对数据库表进行曾删改查的。 数据库:对数据进行持久化的载体 数据访问层:业务层和持久层交互的接口。 MVC模型 全名Model View Controller,是一种用于设计创建 Web