Spring MVC入口Servlet详解(HttpServletBean,FrameworkServlet,DispatcherServlet )

Spring MVC中DispatcherServlet前端控制器是web服务器的入口,那么它是怎么样进行初始化的,是怎么样进行工作?

继承关系

DispatcherServlet继承关系

1. HttpServletBean

主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

2. FrameworkServlet

将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

3. DispatcherServlet 

初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

初始化

HttpSerlvetBean继承自HttpServlet,它覆写了init方法,对初始化过程做了一些处理。 

HttpSerlvetBean初始化

web.xml配置

<servlet>
  <servlet-name>dispatcher</servlet-name>  
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  <load-on-startup>1</load-on-startup>  
  <init-param>
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath:springConfig/dispatcher-servlet.xml</param-value>  
  </init-param>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>  
  <url-pattern>/</url-pattern>  
</servlet-mapping>

上面这段配置,传递了contextConfigLocation参数,之后构造BeanWrapper,这里使用BeanWrapper,有2个理由:
1. contextConfigLocation属性在FrameworkServlet中定义,HttpServletBean中未定义       
2. 利用Spring的注入特性,只需要调用setPropertyValues方法就可将contextConfigLocation属性设置到对应实例中,也就是以依赖注入的方式初始化属性。
然后设置DispatcherServlet中的contextConfigLocation属性(FrameworkServlet中定义)为web.xml中读取的contextConfigLocation参数,该参数用于构造SpringMVC容器上下文。

覆写initServletBean

FrameworkServlet继承自HttpServletBean,该类覆写的initServletBean方法。

FrameworkServlet覆写的initServletBean方法

initWebApplicationContext方法的具体实现逻辑:

FrameworkServlet中initWebApplicationContext源码 FrameworkServlet中initWebApplicationContext源码

web.xml配置

<context-param>
  <param-name>contextConfigLocation</param-name>  
  <param-value>classpath:springConfig/applicationContext.xml</param-value>  
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>

web.xml中配置的ContextLoaderListener监听器中根据contextConfigLocation路径生成的上下文。

覆写onRefresh

DispatcherServlet覆写了FrameworkServlet中的onRefresh方法。

DispatcherServlet覆写onRefresh

initStrategies方法内部会初始化各个策略接口的实现类,包括以下接口

1.异常处理初始化initHandlerExceptionResolvers方法:SpringMVC异常处理机制详解

2.视图处理初始化initViewResolvers方法:SpringMVC视图机制详解

3.请求映射处理初始化initHandlerMappings方法:详解SpringMVC请求的时候是如何找到正确的Controller

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。