<mvc:annotation-driven />
这个标签注册了Spring MVC分发请求到Controller控制器所必须的HandlerMapping和HandlerAdapter实例。
Spring 3.1 之前:
- DefaultAnnotationHandlerMapping
- AnnotationMethodHandlerAdapter
- AnnotationMethodHandlerExceptionResolver
Spring 3.1+ :
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
- ExceptionHandlerExceptionResolver
DefaultAnnotationHandlerMapping
根据url决定使用哪个controller
,AnnotationMethodHandlerAdapter
选择处理请求的实际方法。RequestMappingHandlerMapping
包涵上面2个作用,所以将请求直接映射到方法。
源码分析
DispatcherServlet
初始化的时候,会调用一个方法如下:
|
|
它会初始化一些HandlerMapping
和HandlerAdapter
,这两个方法非常重要
- 初始化
HandlerMapping
|
|
detectAllHandlerMappings
是DispatcherServlet
的一个属性,可以在web.xml
中配置,默认是true,如果为true,则会去从本工程mvc-servlet.xml
文件中去探测所有实现了HandlerMapping
的bean,如果有,则加入DispatcherServlet
的handlerMappings
中。如果detectAllHandlerMappings
为false,则直接去容器中找id="handlerMapping"
且实现了HandlerMapping
的bean.如果以上都没找到,则会去加载默认的HandlerMapping
。
|
|
如果没有配置HandlerMapping
,所以它会去加载默认的,默认的配置如下:
|
|
看看defaultStrategies
是如何初始化的:
|
|
这里使用静态代码块来加载配置文件DispatcherServlet.properties
,它所在位置就是和DispatcherServlet
同一目录下面。默认的配置文件的内容如下:
|
|
也就是说,当你什么都没有配置时,默认会加载以上的配置
默认HandlerMapping
:
|
|
默认HandlerAdapter
:
|
|
参考:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html