SpringMVC项目未配置<mvc:annotation-driven/>仍可运行,其作用是什么?
<mvc:annotation-driven/>仍能正常运行,为何还需要配置它? 我搭建了一个Spring+SpringMVC示例项目,相关配置如下:
web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <servlet> <servlet-name>dispatcher</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> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
spring-mvc.xml
<context:component-scan base-package="com.jiehang.spring.controller" /> <!-- <mvc:annotation-driven /> --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>
spring.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thinXXX" /> <property name="username" value="XXX" /> <property name="password" value="XXX" /> </bean> <bean id="tsmCountsService" class="com.jiehang.spring.service.impl.TsmCountsServiceImpl"> <property name="tsmCountsDao" ref="tsmCountsDao" /> </bean> <bean id="tsmCountsDao" class="com.jiehang.spring.dao.impl.TsmCountsDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean>
Controller代码
@Controller public class FundController { @Autowired private TsmCountsService tsmCountsService; public TsmCountsService getTsmCountsService() { return tsmCountsService; } public void setTsmCountsService(TsmCountsService tsmCountsService) { this.tsmCountsService = tsmCountsService; } @RequestMapping("/queryFund") public ModelAndView queryFundByFundId() { List<TsmCounts> funds = tsmCountsService.queryUser(); System.out.println(funds); return null; } }
当前状态:未启用<mvc:annotation-driven/>标签时,访问http://localhost:8080/TestSpringmvc/queryFund可正常输出结果。想请教为何还需要在spring-mvc.xml中配置<mvc:annotation-driven/>?
回答:
嘿,这个问题我刚学Spring MVC的时候也懵过——明明没开这个标签项目也能跑,那它到底有啥用?我来给你掰扯清楚:
首先,为啥你现在能正常访问?
Spring MVC的DispatcherServlet有个“兜底”机制:当你没有显式配置**处理器映射器(HandlerMapping)和处理器适配器(HandlerAdapter)**的时候,它会自动注册一套默认的实现类。老版本里是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter,新版本换成了RequestMappingHandlerMapping和RequestMappingHandlerAdapter(不过默认注册的逻辑还在)。这些默认组件刚好能识别@Controller和@RequestMapping注解,所以你的简单请求能被正常处理。
那<mvc:annotation-driven/>到底帮你做了啥?
这标签可不是“鸡肋”,它相当于给Spring MVC开了高级功能开关,帮你自动配置了一堆核心组件,这些都是你当前简单场景没用到,但后续扩展绝对离不开的:
- 升级核心处理器组件:它会强制注册最新的
RequestMappingHandlerMapping、RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver,这些组件比默认注册的版本支持更多注解特性——比如@RequestBody、@ResponseBody(用来返回JSON/XML)、@PathVariable的复杂用法,还能自定义参数解析器、返回值处理器。 - 自动配置消息转换器:帮你注册
MappingJackson2HttpMessageConverter这类转换器,你不用手动写配置,就能直接返回JSON格式的响应,或者接收JSON格式的请求参数。 - 支持数据格式化与绑定:默认注册
FormattingConversionService,让你能直接用@NumberFormat、@DateTimeFormat这类注解,把请求里的字符串自动转换成数字、日期类型,不用自己写转换逻辑。 - 集成校验框架:如果你的项目引入了JSR-303校验(比如Hibernate Validator),它会自动注册
LocalValidatorFactoryBean,你直接用@Valid注解就能做参数校验,省了一堆配置。 - 解决静态资源访问问题:配合
<mvc:resources>标签,能让DispatcherServlet放行静态资源(CSS、JS、图片)的请求,避免出现404。如果没配这个标签,后续加静态资源大概率会踩坑。
总结一下
你当前的场景太简单了——只是一个打印日志、返回null的请求,不需要处理JSON、参数格式化这些功能,所以默认组件就能搞定。但一旦你的项目要做复杂功能(比如前后端分离的接口、参数校验、日期转换),没有<mvc:annotation-driven/>的话,你就得手动去配置那些核心组件,不仅麻烦,还容易出错。这标签是生产环境项目里几乎必配的配置,早配早省心~
内容的提问来源于stack exchange,提问作者Hancock

