zoukankan      html  css  js  c++  java
  • SpringMVC源码解读

    1.SpringMVC简介

    SpringMVC框架是围绕一个DispatherServlet来设计的。这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还支持文件上传。处理器是应用中使用注解@Controller和@RequestMapping的类和方法,Spring为处理器方法提供了极其灵活的配置。

    “对扩展开放”是Spring web MVC 框架的一个重要的设计原则,而对应Spring整个框架来说,其设计原则是“对扩展开放,对修改关闭”。

    2.关于DispatherServlet

    从这张图可以清晰的看出,DispatherServlet本质上就是一个Servlet。

    引申:Servlet生命周期

    2.DispatherServlet初始化过程

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
       version="3.1" metadata-complete="true">
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
       <servlet>
          <servlet-name>spring</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:spring-servlet.xml</param-value>
          </init-param>
       </servlet>
       <servlet-mapping>
          <servlet-name>spring</servlet-name>
          <url-pattern>/</url-pattern>
       </servlet-mapping>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
    </web-app>

    1.Servlet 是个接口

    public void init(ServletConfig config) throws ServletException;

    2.GenericServlet 中实现了初始化方法

    public void init(ServletConfig config) throws ServletException {

    this.config = config;
    this.init();//空方法,留给子类实现
    }

    3.HttpServlet 没有对初始化相关的方法进行覆盖

    4.HttpServletBean,重写了init()方法

    其中又调用了一个initServletBean();方法,这本类中也是个空实现。

    5.FrameworkServlet 重写了上边留空的方法:initServletBean();

    initServletBean方法中最重要的就是调用了一个initWebApplicationContext() 方法。

    initWebApplicationContext()内部调用了onRefresh(), 这个方法在本类中为空实现,留给子类去实现。

    6.DispatcherServlet,找到onRefresh()

    @Override
    protected void onRefresh(ApplicationContext context) {
    initStrategies(context);
    }
    protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
     initLocaleResolver(context);
     initThemeResolver(context);
     initHandlerMappings(context);
     initHandlerAdapters(context);
     initHandlerExceptionResolvers(context);
     initRequestToViewNameTranslator(context);
     initViewResolvers(context);
     initFlashMapManager(context);
    }

    至此,DispatherServlet初始化完毕!

    3.DispatherServlet工作原理

    ①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.

    ②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.

    ③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.

    ④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.

    4.几个关键的类或接口

    HandlerMapping

    HandlerExecutionChain

    HandlerInterceptor

    HandlerAdapter

    View

    5.分步讲解源码

  • 相关阅读:
    TXNLP 01-09
    王某的NLP之路前言
    回归模型(一) 线性回归
    回归模型(三) 岭回归
    回归模型(二) 逻辑回归
    hadoop中的JournalNode
    systemctl详解
    HADOOP HA 报错
    集成学习的不二法门bagging、boosting和三大法宝<结合策略>平均法,投票法和学习法(stacking)
    阿里云集群搭建
  • 原文地址:https://www.cnblogs.com/lixiuyu/p/7088580.html
Copyright © 2011-2022 走看看