ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DispatcherServlet初始化顺序详解

2022-09-04 01:30:50  阅读:234  来源: 互联网

标签:初始化 上下文 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
来源: https://www.cnblogs.com/bkycnd/p/16654131.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有