spring mvc的<mvc:annotation-driven/>有什么用?

转载:https://www.zhihu.com/question/362051844

你提的这个问题是一个相当复杂的问题,如果想要把这个搞透彻,必须建立在对spring ioc和spring mvc源码熟悉的前提上,否则无法看懂接下来我要说的东西,我的描述会尽量简单,忽略无关细节,版本用5.2.7spring文档上这样解释annotation-driven:The preceding example registers a number of Spring MVC infrastructure beans and adapts to dependencies available on the classpath (for example, payload converters for JSON, XML, and others).它的意思就是,annotation-driven注册了一系列基础bean,和一些classpath上依赖进来的bean用人话来翻译,基础bean只能提供最基础的服务,其它的扩展功能,比如JSON、XML、Valid等等,根据classpath有没有相关的依赖来决定要不要添加对应的bean或者属性例如:写一个最简单的返回ModelAndView的Controller,不加annotation-driven,你会发现它是可以运行的,但如果改成返回Json对象加上ResponseBody就会报错,这正好映证了文档中的说法下面从源码出发来看为什么是这样的首先,不论加不加annotation-driven,servlet初始化流程都是这样开始的web容器(任意支持servlet规范的容器,比如tomcat)调用loadServlet,进而调用了DispatcherServlet顶级父类HttpServletBean的init方法,接着向子类调用去new一个webApplicationContext并refresh,refresh时根据配置文件的条目,找对应的handler去处理比如mvc:annotation-driven处理类是AnnotationDrivenBeanDefinitionParser,context:component-scan处理类是ComponentScanBeanDefinitionParser接下来看不加annotation-driven的情况容器创建完成后,会进行事件广播,触发DispatcherServlet的OnRefresh方法OnRefresh会注册一大堆的bean到容器中,如果之前容器里面已经有了相同类型的bean,那么就不做任何事情如果没有,注册一些默认的bean到容器中。都有哪些默认的bean呢?打开

org\springframework\spring-webmvc\5.2.6.RELEASE\spring-webmvc-5.2.6.RELEASE.jar!\org\springframework\web\servlet\DispatcherServlet.properties
``
作者:withcancer
链接:https://www.zhihu.com/question/362051844/answer/1286615054
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果加了annotation-drivenmvc:annotation-driven的处理类AnnotationDrivenBeanDefinitionParser也会注册一大堆的bean到容器中,跟上面对照一下来看看HandlerMappingRequestMappingHandlerMapping和BeanNameUrlHandlerMapping HandlerAdapterRequestMappingHandlerAdapter,HttpRequestHandlerAdapter和SimpleControllerHandlerAdapter HandlerExceptionResolverExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver 接下来去调用OnRefresh时,发现这些bean已经注册了,所以不会去注册DispatcherServlet.properties里面记载的默认bean,这说明annotation-driven覆盖了默认配置所以你的问题的答案就是:这两种方式注册出来的基础bean几乎是一致的,所以才会造成加不加这个annotation-driven,基本功能不受到影响的结果==========================================================另外,annotation-driven的作用就是提供扩展功能,具体提供的扩展功能在这里面延续上面在没有加annotation-driven时,Controller返回JSON报错的例子,来说明classpath这种功能扩展方式的原理假如classpath中有jackson相关依赖,AnnotationDrivenBeanDefinitionParser处理类就会把jackson2Present设为true注册MappingJackson2HttpMessageConverter这个messageConverter

作者:withcancer
链接:https://www.zhihu.com/question/362051844/answer/1286615054
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-05-04 springMVC
点击右上角即可分享
微信分享提示