You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringMVC项目未配置<mvc:annotation-driven/>仍可运行,其作用是什么?

疑问:SpringMVC未启用<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:11:08