概述
缺省配置Springboot Web
应用中的SpringMVC DispatcherServlet
,从整个应用开始启动到最终处于服务请求的状态,粗略地讲,可以分为两步 :
- 缺省配置
Springboot Web
应用启动过程中SpringMVC DispatcherServlet
的准备
这一步相当于把
DispatcherServlet
安装部署到一个可以随时服务请求的web
应用中去;
关于这一步的详细情况,可以参考文章
缺省配置Springboot Web应用启动中准备SpringMVC DispatcherServlet
- 缺省配置
Springboot Web
应用运行中SpringMVC DispatcherServlet
的初始化
这一步指的是
Servlet.init()
方法的调用,本文主要分析这一过程。
源代码分析
HttpServletBean
的init
方法
DispatcherServlet
和父类的继承关系如下 :
DispatcherServlet -> FrameworkServlet -> HttpServletBean --> HttpServlet
这个继承关系里面,DispatcherServlet
,FrameworkServlet
,HttpServletBean
都是Spring
的类,位于以下包 :
org.springframework.web.servlet
而 HttpServlet
是 Java Servlet API
,表示一个HTTP Servlet
,是一个抽象类,位于包 :
javax.servlet.http
这里面Servle
t的初始化方法 init()
实现在 HttpServletBean
中 :
// 类 org.springframework.web.servlet.HttpServletBean 的方法
@Override
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
}
// Set bean properties from init parameters.
// 从初始化参数 init paramters 中提取参数值设置bean属性
// 完全缺省配置的Springboot Web应用,这里最终的pvs为空:pvs.isEmpty()==true
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
if (!pvs.isEmpty()) {
try {
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);
}
catch (BeansException ex) {
if (logger.isErrorEnabled()) {
logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
}
throw ex;
}
}
// Let subclasses do whatever initialization they like.
// initServletBean()是HttpServletBean定义的一个空方法,目的是让子类填充相应的初始化实现
initServletBean();