在springmvc.xml中,经常会配置<mvc:annotation-driven/><mvc:default-servlet-handler/>下面来看下这两个配置有什么作用吧:

1、两者都不配置
这里写图片描述
如果两个都没有配置,springmvc容器初始化时会默认读取DispatcherServlet.properties中的默认参数加载HandlerAdapter, HandlerExceptionResolver和HandlerMapping,还有其他很多默认加载项,这里就不一一列举。重点看这三项:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

2、仅配置<mvc:default-servlet-handler/>
这里写图片描述

可见仅仅配置了<mvc:default-servlet-handler/>时,框架主要注入了SimpleUrlHandlerMapping,并去掉了AnnotationMethodHandlerAdapter 和DefaultAnnotationHandlerMapping。
为什么这样?因为这里用不上AnnotationMethodHandlerAdapter 和DefaultAnnotationHandlerMapping了!当只配置<mvc:default-servlet-handler/>时,所有请求都交给默认的servlet进行处理了,dispatchServlet也就无法发挥相应的功能了,所有这里对于处理器请求的解析和处理也就不需要了。

3、仅配置<mvc:annotation-driven/>
这里写图片描述

<mvc:annotation-driven/>的作用:

  • 注入RequestMappingHandlerAdapter替代AnnotationMethodHandlerAdapter
  • 注入ExceptionHandlerExceptionResolver替代AnnotationMethodHandlerExceptionResolver
  • 注入RequestMappingHandlerMapping替代DefaultAnnotationHandlerMapping

4、两者都配置
这里写图片描述

一般我们会两个同时配置

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐