DispatcherServlet的作用与原理

在写一个SpringMVC项目的时候,第一步就是要在部署描述符文件(web.xml)中配置DispatcherServlet,所以我们要在web.xml中添加如下代码

        <servlet>
		<servlet-name>springServlet</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> <!-- 是否在项目启动时加载dispatcherServlet -->
	</servlet>
	<servlet-mapping>
		<servlet-name>springServlet</servlet-name>
		<url-pattern>/test</url-pattern>
	</servlet-mapping>

这个dispatcherServlet有什么用呢?网上定义“dispatcherServlet为SpringMVC提供集中的访问点,用于调派各种任务,无缝与IOC容器相集成”,挺起来十分玄奥的样子,那到底它是怎么样的呢?

我们知道,DispatcherServlet归根结底还是一个Servlet,那么必然有着Servlet的生命周期,init( ),Service( ),destroy( )。而且init方法会在servlet第一次被创建时被调用,之后每一次创建该servlet都不会再被调用,通常用来初始化某些底层的配置。那么dispatcherServlet的init方法是咋样的呢?让我们看看它的源码!

protected void initStrategies(ApplicationContext context) {
		initMultipartResolver(context);
		initLocaleResolver(context);
		initThemeResolver(context);
		initHandlerMappings(context);
		initHandlerAdapters(context);
		initHandlerExceptionResolvers(context);
		initRequestToViewNameTranslator(context);
		initViewResolvers(context);
		initFlashMapManager(context);
	}

咦!我们看到了一位老朋友ApplicationContext,它是依赖注入最基本的容器,其内部接口beanFactory负责xml文件中bean对象的创建和调用。该方法内部的initViewResolver,initLocaleResolver等,这几个resolver都是在Spring的xml配置文件里的常客。所以该方法毋庸置疑,是用来读取配置文件中的某些配置,并将其初始化的,让我们看看其中initMulPartResolver的源码验证一下!


果不其然!

其次要注意,如果有load-on-startup,就说明该dispatcherServlet会在项目被启动时调用init方法,所以我们会看到SpringMVC项目在启动时,控制台会刷一大堆resolver的初始化信息,就是他搞的鬼了。如果没有load-on-startup,那么初始化会在第一次访问url-pattern的时候进行。

这就是这次探索的全部感悟,欢迎指正!


猜你喜欢

转载自blog.csdn.net/qq_26950567/article/details/80292620