之前给大家介绍了什么是dispatcherservlet,以及dispatcherservlet配置等方面的内容,那么下面要接着给大家介绍的就是dispatcherservlet初始化过程,一起来了解一下。

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覆盖。

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()方法执行容器的一些初始化,这个方法由子类实现,来进行扩展。

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初始化的过程具体主要做了初始化Spring Web

MVC使用的Web上下文,并且可能指定父容器为(ContextLoaderListener加载了根上下文)以及初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等这两件事情。

现在有很多人都想要成为java架构师,假如你想了解这方面的知识,那么请继续关注奇Q工具网来进行了解吧。

推荐阅读:

java dispatcher详解_dispatcherservlet初始化过程详解相关推荐

  1. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  2. Spring生命周期Bean初始化过程详解

    Spring生命周期Bean初始化过程详解 Spring 容器初始化 Spring Bean初始化 BeanFactory和FactoryBean 源码分析 Bean的实例化 preInstantia ...

  3. Java 父类子类的对象初始化过程

    转载自 Java 父类子类的对象初始化过程 摘要: Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: ...

  4. 解析 Java 类和对象的初始化过程

    跳转到主要内容 中国 [ 选择 ] dW 全部内容--------------  AIX and UNIX  Info Mgmt  Lotus  Rational  WebSphere-------- ...

  5. java的连接 初始化_java类从加载、连接到初始化过程详解

    Java代码在编译后会转化成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 类加载 ...

  6. 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 问题引入 近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码 ...

  7. java 虚拟机 初始化_【深入理解Java虚拟机】类的初始化过程

    类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...

  8. 【JAVA基础篇】对象初始化过程

    我们都知道,创建对象是由 new关键字调用构造方法 返回类实例(实际上还可以通过反射来创建实例). 例如 : Person jack = new Person(); 这句话到底做了什么事情呢 ? 其实 ...

  9. 解析 Java 类和对象的初始化过程(zhuang张 国建 (guojian.zhang@gmail

    [url]http://www.blogjava.net/rendong/default.html?page=2[/url]

最新文章

  1. js 将二进制流html导出excel,js 实现纯前端将数据导出excel
  2. 高级编程学习笔记day01(知识点篇)
  3. LSTM股票价格预测
  4. pandas算加权平均值_4000 字详解TCP超时与重传,看完没收获算我输
  5. 计算机控制面板图标怎么删除,电脑如何找回消失的“添加或删除程序”图标
  6. 一道关于String的易错习题
  7. linux redis-trib.rb,linux 关于redis-trib.rb构建redis集群
  8. IE和火狐读取XML方法比较
  9. ADO.NET_07_OracleDataAdapter
  10. 一周第二次课(3月20日)1.6/1.7 配置IP 1.8 网络问题排查
  11. Udacity数据分析(入门)-探索美国共享单车数据
  12. 37 一次获取redis连接阻塞引起的 Thread pool is EXHAUSTED
  13. 13视频监控-01视频监控布局-videobox
  14. linux统计代码耗时函数,统计函数执行耗时
  15. npm rebuild记录
  16. 数据库 | Mysql - [索引]
  17. 用Python实现斐波那契数列代码
  18. Soot 静态分析框架(二)Soot的核心
  19. 一般迭代法与steffensen迭代法matlab实现
  20. python营业数据分析_基于pandas python的美团某商家的评论销售(数据分析)

热门文章

  1. centos 修改ip地址
  2. MusicXML 3.0 (20) - 钢琴踏板
  3. 初学者看看PHP explode() 函数 第6篇
  4. phpexcel.php linux,phpexcel在linux系统报错如何解决
  5. Java 集合体系详解——List体系有序集合
  6. jquery $.each遍历json数组方法
  7. linux 扫描mipi设备,VS-RK3399 在linux系统下面调试Mipi camera接口介绍
  8. [转载] Java字符串分割方法
  9. [转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
  10. Java LocalDateTime类| 带示例的getMinute()方法