SpringMVC加载流程( 四 )

3.2. 重写doService方法
 实现了Http请求的处理过程,具体流程如下图,即开头提及的SpringMVC处理Http请求的过程,前面已经介绍过流程,这里不再赘述 。

SpringMVC加载流程

文章插图
 
3.3. mvc:annotation-driven 按照之前说的,先看resource/META-INF/spring.handlers文件,这个配置在spring-webmvc模块下,内容为:
http://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler支持的标签如下:
SpringMVC加载流程

文章插图
 
annotation-driven的解析类为:AnnotationDrivenBeanDefinitionParser,该类主要自动做了如下动作:
  • 注入了RequestMappingHandlerMapping和BeanNameUrlHandlerMapping两个HandlerMapping实现
  • 注入了RequestMappingHandlerAdapter、HttpRequestHandlerAdapter和SimpleControllerHandlerAdapter三个HandlerAdapter实现 。需要指出的是对于RequestMappingHandlerAdapter,如果没有配置message-converters标签指定消息处理器的话,会根据classpath中存在的包自动注入处理器,包括: ByteArrayHttpMessageConverter StringHttpMessageConverter ResourceHttpMessageConverter SourceHttpMessageConverter AllEncompassingFormHttpMessageConverter 如果存在com.rometools.rome.feed.WireFeed类,则增加AtomFeedHttpMessageConverter、RssChannelHttpMessageConverter 如果存在com.fasterxml.jackson.dataformat.xml.XmlMapper类,则增加MappingJackson2XmlHttpMessageConverter 如果存在javax.xml.bind.Binder类,则增加Jaxb2RootElementHttpMessageConverter 如果存在com.fasterxml.jackson.databind.ObjectMapper和com.fasterxml.jackson.core.JsonGenerator,则增加MappingJackson2HttpMessageConverter 如果存在com.google.gson.Gson,则增加GsonHttpMessageConverter
  • 注入了ExceptionHandlerExceptionResolver用于实现@ExceptionHandler注解、注入了ResponseStatusExceptionResolver用于实现@ResponseStatus和DefaultHandlerExceptionResolver
  • 注入了AntPathMatcher和UrlPathHelper用于路径解析
 上面介绍了SpringMVC大体流程的实现,当然还有很多细节没有进行说明,如@Param,HttpServletRequest等各种参数的解析和注入,响应结果转为json等各种结果的加工,详细内容可以根据上面介绍再进行深入 。
4. WebApplicationInitializer Servlet3.0+提供了ServletContainerInitializer接口,用于在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等 。
 每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类 。spring-web模块下便存在该配置:
SpringMVC加载流程

文章插图
 
内容为:
org.springframework.web.SpringServletContainerInitializerSpringServletContainerInitializer的主要功能是加载classpath下的所有WebApplicationInitializer实现类(非接口、非抽象类),按照@Order进行排序后依次执行WebApplicationInitializer的onStartup方法 。
 spring-web模块提供的抽象类实现AbstractContextLoaderInitializer能够不用web.xml配置增加RootContext;提供的抽象类实现AbstractDispatcherServletInitializer能够不用web.xml配置增加DispatcherServlet 。当然更重要的实现是SpringBoot中的实现,这个后续介绍SpringBoot时再提 。
更多原创内容请搜索微信公众号:啊驼(doubaotaizi)

【SpringMVC加载流程】


推荐阅读