首页 > 其他分享 >DispatcherServlet初始化顺序详解

DispatcherServlet初始化顺序详解

时间:2022-09-04 01:34:09浏览次数:68  
标签:初始化 上下文 Web wac 详解 context DispatcherServlet

1. Web容器启动时将调用HttpServletBean的init方法

public abstract class HttpServletBean extends HttpServlet implements EnvironmentAware{
    @Override
    public final void init() throws ServletException {
       //省略部分代码
       //1、如下代码的作用是将Servlet初始化参数设置到该组件上
       //如contextAttribute、contextClass、namespace、contextConfigLocation;
       try {
           PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
           BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
           ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
           bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
           initBeanWrapper(bw);
           bw.setPropertyValues(pvs, true);
       }
       catch (BeansException ex) {
           //…………省略其他代码
       }
       //2、提供给子类初始化的扩展点,该方法由FrameworkServlet覆盖
       initServletBean();
       if (logger.isDebugEnabled()) {
           logger.debug("Servlet '" + getServletName() + "' configured successfully");
       }
    }
    //…………省略其他代码
}

将Servlet初始化参数(init-param)设置到该组件上(如contextAttribute、contextClass、namespace、contextConfigLocation),通过BeanWrapper简化设值过程,方便后续使用;

提供给子类初始化扩展点,initServletBean(),该方法由FrameworkServlet覆盖。

2. FrameworkServlet通过initServletBean()进行Web上下文初始化

public abstract class FrameworkServlet extends HttpServletBean {
	@Override
    protected final void initServletBean() throws ServletException {
        //省略部分代码
       try {
             //1、初始化Web上下文
           this.webApplicationContext = initWebApplicationContext();
             //2、提供给子类初始化的扩展点
           initFrameworkServlet();
       }
        //省略部分代码
    }
}

该方法主要作用如下:

初始化web上下文; 

提供给子类初始化扩展点;

protected WebApplicationContext initWebApplicationContext() {
	//ROOT上下文(ContextLoaderListener加载的)
   WebApplicationContext rootContext =
		  WebApplicationContextUtils.getWebApplicationContext(getServletContext());
   WebApplicationContext wac = null;
   if (this.webApplicationContext != null) {
	   // 1、在创建该Servlet注入的上下文
	   wac = this.webApplicationContext;
	   if (wac instanceof ConfigurableWebApplicationContext) {
		  ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
		  if (!cwac.isActive()) {
			  if (cwac.getParent() == null) {
				  cwac.setParent(rootContext);
			  }
			  configureAndRefreshWebApplicationContext(cwac);
		  }
	   }
   }
   if (wac == null) {
		 //2、查找已经绑定的上下文
	   wac = findWebApplicationContext();
   }
   if (wac == null) {
		//3、如果没有找到相应的上下文,并指定父亲为ContextLoaderListener
	   wac = createWebApplicationContext(rootContext);
   }
   if (!this.refreshEventReceived) {
		 //4、刷新上下文(执行一些初始化)
	   onRefresh(wac);
   }
   if (this.publishContext) {
	   // Publish the context as a servlet context attribute.
	   String attrName = getServletContextAttributeName();
	   getServletContext().setAttribute(attrName, wac);
	   //省略部分代码
   }
   return wac;
}

从initWebApplicationContext()方法可以看出,基本上如果ContextLoaderListener加载了上下文将作为根上下文(DispatcherServlet的父容器)。 最后调用了onRefresh()方法执行容器的一些初始化,这个方法由子类实现,来进行扩展。

3. DispatcherServlet实现了onRefresh()方法提供一些前端控制器相关的配置

public class DispatcherServlet extends FrameworkServlet {
     //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
    @Override
    protected void onRefresh(ApplicationContext context) {
       initStrategies(context);
    }

    //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
    protected viod initStrategies(ApplicationContext context){
		initMultipartResolver(context);//初始化上传文件解析器
		initLocaleResolver(context);//初始化本地解析器
		initThemeResolver(context);//初始化主题解析器
		initHandlerMapping(context);
		//初始化处理器映射器,将请求映射到处理器
		initHandlerAdapters(context);//初始化处理器适配器
		initHandlerExceptionResolver(context);
		//初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
		initRequestToViewNameTranslator(context);
		//初始化请求到具体视图名称解析器
		initViewResolvers(context);
		//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
		initFlshMapManager(context);//初始化flash映射管理
	}
}

initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或者类型匹配的机制查找自定义组件,如果没有找到则会装配一套Spring的默认组件.在org.springframework.web.servlet路径下有一个DispatcherServlet.properties配置文件,该文件指定了DispatcherServlet所使用的默认组件.

 

DispatcherServlet启动时会进行我们需要的Web层Bean的配置,如HandlerMapping、HandlerAdapter等,而且如果我们没有配置,还会给我们提供默认的配置。

整个DispatcherServlet初始化的过程具体主要做了如下两件事情:
1. 初始化Spring Web MVC使用的Web上下文,并且可能指定父容器为(ContextLoaderListener加载了根上下文);
2. 初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等。

标签:初始化,上下文,Web,wac,详解,context,DispatcherServlet
From: https://www.cnblogs.com/bkycnd/p/16654131.html

相关文章

  • 13.开发小技巧-Spring Initailizr(项目初始化向导)
    选择我们需要的开发场景  勾选场景后就自动导入了依赖  自动创建项目结构  自动编写好主配置类   ......
  • Spark中的Spark Shuffle详解[转]
    Shuffle简介Shuffle描述着数据从maptask输出到reducetask输入的这段过程。shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle......
  • Java Script面向对象详解(一`)
    JavaScript面向对象详解(一)ES6之前的JavaScript面向对象比较不好理解,涉及到很多知识和思想。ES6增加了class和extends来实现类的封装和继承,但是通过babel转换成ES5之后......
  • python3之35个关键字详解
    一、python35个关键字列举:help("keywords")查看运行结果:1.and、or、not2.if、elif、else3.for、while4.True、False5.continue、break6.pass7.try、except、f......
  • JavaScript详解(一)
    回顾前端三要素HTML(结构):超文本标记语言(HyperTextMarkupLanguage)决定网页结构和内容CSS(表现):层叠样式表(CascadingStyleSheets),设定网页的表现形式JavaScript(行......
  • JavaScript详解(二)
    面向对象原型对象类模板原型对象对象具体的实例原型varStudent={name:"xiaoqiang",age:3,run:functio......
  • Python3项目初始化10-->前端基础jquery、ajax,sweetalert--更新用户改造
    33、JS基础-ajax_post截止目前,完成了登录,创建和删除,“编辑”这块还是老的信息。打开a、点击编辑=>(内容)=>dialogb、内容=>后端ajax 页面上遍历用户时......
  • Linux下用户组、文件权限详解
    Linux下用户组、文件权限详解-打伞的鱼-博客园 https://www.cnblogs.com/123-/p/4189072.html用户组在linux中的每个用户必须属于一个组,不能独立于组外。在linux中......
  • 系统优化-----sysctl.conf文件内核设置参数详解
    系统优化-----sysctl.conf文件内核设置参数详解_tallercc的博客-CSDN博客 https://blog.csdn.net/tallercc/article/details/52823075sysctl.conf工作原理 sysctl命......
  • ClickHouse(05)ClickHouse数据类型详解
    ClickHouse属于分析型数据库,ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。其中基础类型使ClickHouse具备了描述数据的基本能力,而另外两种类......