3.1、DispatcherServlet的加载/创建/初始化
![DispatcherServlet类关系](https://i-blog.csdnimg.cn/blog_migrate/1ddad93aa505f556ea7cd4e89c1c8397.jpeg)
3.1.1、DispatcherServlet加载
static {
try {
// 策略文件:DispatcherServlet同一目录下的DispatcherServlet.properties
ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
catch (IOException ex) {
throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH + "': " + ex.getMessage());
}
}
3.1.2、DispatcherServlet创建
// DispatcherServlet
public DispatcherServlet() {
super();
setDispatchOptionsRequest(true);
}
//其父类的空构造函数均无意义
3.1.2、DispatcherServlet初始化
// HttpServletBean
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
}
/* 会解析web.xml配置中,对当前Servlet配置的<init-param>标签,并将标签中的参数注入到Servlet的字段中,如下:contextConfigLocation的值会被注入到Servlet的同名字段中
* <servlet>
* <servlet-name>springMvc</servlet-name>
* <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
* <init-param>
* <param-name>contextConfigLocation</param-name>
* <param-value>classpath:spring-mvc.xml</param-value>
* </init-param>
* <load-on-startup>1</load-on-startup>
* </servlet>
* contextConfigLocation参数
* /
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);
}