Spring中@EnableWebMvc是什么?为何《Spring实战》配置与我的实践不同?
关于@EnableWebMvc和Spring MVC配置的困惑解答
嘿,我完全理解你的困惑——刚用Spring Boot的时候,确实会觉得“为什么书上写的这么复杂,我啥都没配也能用?”咱们一步步拆解:
1. 为什么你之前不需要@EnableWebMvc?
你之前开发基础Web应用时用的应该是Spring Boot,它的核心优势之一就是自动配置(AutoConfiguration)。Spring Boot的WebMvcAutoConfiguration类会帮你自动完成Spring MVC的基础配置:
- 自动注册
DispatcherServlet(Spring MVC的核心控制器) - 默认配置视图解析器(比如支持JSP、Thymeleaf等模板引擎)
- 配置常用的消息转换器(比如JSON序列化)
- 映射静态资源(比如
/static/目录下的文件)
这就是为什么你不用加@EnableWebMvc也能正常开发——Spring Boot已经替你做了这些脏活累活。
2. 书中的配置是旧代码吗?
不一定是“旧代码”,更准确地说,是不同场景下的配置方式:
- 如果书籍是基于**纯Spring Framework(非Spring Boot)**编写的(比如《Spring实战》的早期版本,在Spring Boot普及之前),那么必须手动添加
@EnableWebMvc来启用Spring MVC,还要手动配置视图解析器、资源映射等——因为纯Spring没有自动配置的机制。 - 新版本的《Spring实战》应该会区分Spring Boot和纯Spring的场景,但可能还是会保留手动配置的内容,因为这是理解Spring MVC底层原理的关键。
3. 这些配置还有实用价值吗?
当然有!当你需要定制Spring MVC的行为时,这些配置就必不可少了。举几个常见场景:
- 自定义视图解析器:比如你想修改JSP文件的路径前缀/后缀,或者添加自定义的模板引擎支持
- 调整JSON序列化规则:比如忽略null值、修改日期格式
- 添加拦截器:比如做登录校验、日志记录
- 自定义静态资源映射:比如把
/files/**映射到本地磁盘的某个目录
在Spring Boot中,你有两种定制方式:
方式一:完全接管配置(对应书中的写法)
添加@EnableWebMvc,然后实现WebMvcConfigurer接口,重写方法来配置所有细节。这种方式会关闭Spring Boot的自动配置,完全由你掌控:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { // 自定义JSP视图解析器 registry.jsp("/WEB-INF/custom-views/", ".jsp"); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 自定义JSON转换器 MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); converter.setObjectMapper(objectMapper); converters.add(converter); } }
方式二:基于自动配置做扩展(更推荐)
不添加@EnableWebMvc,直接实现WebMvcConfigurer接口。这种方式会保留Spring Boot的默认配置,你只需要覆盖自己需要修改的部分:
@Configuration public class CustomWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 添加自定义拦截器,不影响其他默认配置 registry.addInterceptor(new LoggingInterceptor()) .addPathPatterns("/api/**"); } }
总结
你之前没用到这些配置,是因为Spring Boot的自动配置已经满足了基础Web应用的需求。书中的内容不是没用,而是在教你理解Spring MVC的底层逻辑,以及如何在需要定制的时候手动配置——这些都是进阶开发必须掌握的技能。
内容的提问来源于stack exchange,提问作者Pasker
相关产品推荐
相关产品推荐

