SpringMVC源码的初始化流程
文章目录
前言
从Tomcat的Servlet容器初始化SpringMVC中的DispatcherServlet流程
提示:以下是本篇文章正文内容,下面案例可供参考
一、引入配置
代码如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>lyc-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--SpringMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>lyc-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
二、Servlet的初始化
1.GenericServlet的初始化
代码如下(示例):
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
这是javax.servlet.GenericServlet
2.HttpServletBean的初始化
代码如下(示例):
@Override
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
}
// 从初始化的参数中的设置bean的属性
ServletConfig servletConfig = getServletConfig();
PropertyValues pvs = new ServletConfigPropertyValues(servletConfig,this.requiredProperties);
if (!pvs.isEmpty()) {
try {
// 构造一个BeanWrapperImpl实例
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
// 从ServletConfig里面取ServletContext
ServletContext servletContext = getServletContext();
ResourceLoader resourceLoader = new ServletContextResourceLoader(servletContext);
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;
}
}
initServletBean();
if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully");
}
}
三、Servlet构建上下文
1.FrameworkServlet构建上下文
代码如下(示例):
@Override
protected final void initServletBean() throws ServletException {
getServletContext().log("Initializing Spring FrameworkServlet '" + getServletName() + "'");
if (this.logger.isInfoEnabled()) {
this.logger.info("FrameworkServlet '" + getServletName() + "': initialization started");
}
long startTime = System.currentTimeMillis();
try {
// 单一职责,FrameworkServlet提供Web运用上下文
this.webApplicationContext = initWebApplicationContext();
// 空实现
initFrameworkServlet();
}
catch (ServletException ex) {
this.logger.error("Context initialization failed", ex);
throw ex;
}
catch (RuntimeException ex) {
this.logger.error("Context initialization failed", ex);
throw ex;
}
if (this.logger.isInfoEnabled()) {
long elapsedTime = System.currentTimeMillis() - startTime;
this.logger.info("FrameworkServlet '" + getServletName() + "': initialization completed in " +
elapsedTime + " ms");
}
}
总结
Servlet通过启动执行init方法构建SpringMVC容器以及构建上下文