springmvc学习

SpringMvc初始化

Springmvc的入口是DispatcherServlet,先从这里看起
DispatcherServlet的继承关系图
dispatcherServlet继承图

初始化

DispatchServlet中的static

static块中加载了一个与DispatcherServlet同包下的名为DispatcherServlet.properties的配置文件,使用配置文件中的配置作为DispatcherServlet运行时的默认策略组件

init方法

DispatcherServlet继承了HttpServlet,在web容器初始化后会调用Servlet#init(ServletConfig)方法进行初始化

初始化调用流程

  1. javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
    将ServletConfig赋值给自身的config属性,使子类可以通过javax.servlet.GenericServlet#getServletConfig()获取
  2. org.springframework.web.servlet.HttpServletBean#init()
    将配置信息设置到DispatcherServlet
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //获得web.xml中的contextConfigLocation配置属性,就是spring MVC的配置文件
    PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
    BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
    //获取服务器的各种信息
    ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
    bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
    //模板方法,可以在子类中调用(DispatcherServlet没有),做一些初始化工作,bw代表DispatcherServelt
    initBeanWrapper(bw);
    //将配置的初始化值设置到DispatcherServlet中
    bw.setPropertyValues(pvs, true);
  3. org.springframework.web.servlet.FrameworkServlet#initServletBean()
    初始化SpringMvc的Ioc容器
  4. org.springframework.web.servlet.DispatcherServlet#onRefresh()
    初始化DispatcherServlet的各个组件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    protected void initStrategies(ApplicationContext context) {
    // 文件上传请求的解析器
    initMultipartResolver(context);
    // 本地化解析器
    initLocaleResolver(context);
    // 主题解析器
    initThemeResolver(context);
    // 通过HandlerMapping,将请求映射到处理器
    initHandlerMappings(context);
    // 通过HandlerAdapter支持多种类型的处理器
    initHandlerAdapters(context);
    // 如果执行过程中遇到异常,将交给HandlerExceptionResolver来解析
    initHandlerExceptionResolvers(context);
    // 直接解析请求到视图名
    initRequestToViewNameTranslator(context);
    // 通过viewResolver解析逻辑视图到具体视图实现
    initViewResolvers(context);
    // FlashMapManager请求重定向数据管理器
    initFlashMapManager(context);
    }