java dispatcher详解_dispatcherservlet初始化过程详解
之前给大家介绍了什么是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初始化过程详解相关推荐
- hadoop作业初始化过程详解(源码分析第三篇)
(一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...
- Spring生命周期Bean初始化过程详解
Spring生命周期Bean初始化过程详解 Spring 容器初始化 Spring Bean初始化 BeanFactory和FactoryBean 源码分析 Bean的实例化 preInstantia ...
- Java 父类子类的对象初始化过程
转载自 Java 父类子类的对象初始化过程 摘要: Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: ...
- 解析 Java 类和对象的初始化过程
跳转到主要内容 中国 [ 选择 ] dW 全部内容-------------- AIX and UNIX Info Mgmt Lotus Rational WebSphere-------- ...
- java的连接 初始化_java类从加载、连接到初始化过程详解
Java代码在编译后会转化成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 类加载 ...
- 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起
在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 问题引入 近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码 ...
- java 虚拟机 初始化_【深入理解Java虚拟机】类的初始化过程
类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...
- 【JAVA基础篇】对象初始化过程
我们都知道,创建对象是由 new关键字调用构造方法 返回类实例(实际上还可以通过反射来创建实例). 例如 : Person jack = new Person(); 这句话到底做了什么事情呢 ? 其实 ...
- 解析 Java 类和对象的初始化过程(zhuang张 国建 (guojian.zhang@gmail
[url]http://www.blogjava.net/rendong/default.html?page=2[/url]
最新文章
- js 将二进制流html导出excel,js 实现纯前端将数据导出excel
- 高级编程学习笔记day01(知识点篇)
- LSTM股票价格预测
- pandas算加权平均值_4000 字详解TCP超时与重传,看完没收获算我输
- 计算机控制面板图标怎么删除,电脑如何找回消失的“添加或删除程序”图标
- 一道关于String的易错习题
- linux redis-trib.rb,linux 关于redis-trib.rb构建redis集群
- IE和火狐读取XML方法比较
- ADO.NET_07_OracleDataAdapter
- 一周第二次课(3月20日)1.6/1.7 配置IP 1.8 网络问题排查
- Udacity数据分析(入门)-探索美国共享单车数据
- 37 一次获取redis连接阻塞引起的 Thread pool is EXHAUSTED
- 13视频监控-01视频监控布局-videobox
- linux统计代码耗时函数,统计函数执行耗时
- npm rebuild记录
- 数据库 | Mysql - [索引]
- 用Python实现斐波那契数列代码
- Soot 静态分析框架(二)Soot的核心
- 一般迭代法与steffensen迭代法matlab实现
- python营业数据分析_基于pandas python的美团某商家的评论销售(数据分析)
热门文章
- centos 修改ip地址
- MusicXML 3.0 (20) - 钢琴踏板
- 初学者看看PHP explode() 函数 第6篇
- phpexcel.php linux,phpexcel在linux系统报错如何解决
- Java 集合体系详解——List体系有序集合
- jquery $.each遍历json数组方法
- linux 扫描mipi设备,VS-RK3399 在linux系统下面调试Mipi camera接口介绍
- [转载] Java字符串分割方法
- [转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
- Java LocalDateTime类| 带示例的getMinute()方法