Spring MVC中DispatcherServlet前端控制器是web服务器的入口,那么它是怎么样进行初始化的,是怎么样进行工作?
继承关系
1. HttpServletBean
主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
2. FrameworkServlet
将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
3. DispatcherServlet
初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。
初始化
HttpSerlvetBean继承自HttpServlet,它覆写了init方法,对初始化过程做了一些处理。
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方法。
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方法。
initStrategies方法内部会初始化各个策略接口的实现类,包括以下接口
1.异常处理初始化initHandlerExceptionResolvers方法:SpringMVC异常处理机制详解
2.视图处理初始化initViewResolvers方法:SpringMVC视图机制详解
3.请求映射处理初始化initHandlerMappings方法:详解SpringMVC请求的时候是如何找到正确的Controller
标签:xml,web,FrameworkServlet,初始化,Spring,contextConfigLocation,MVC,上下文 From: https://blog.51cto.com/u_16248220/8001188