@EnableWebMvc
@EnableWebMvc 通常与 @Configuration 一起使用。
从下面的代码中你可以注意到,@EnableWebMvc 里使用了 @Import(value=DelegatingWebMvcConfiguration.class) 注解,而且 DelegatingWebMvcConfiguration.class 也是一个配置类(因为它也使用了 @Configuration),并且 DelegatingWebMvcConfiguration.class 继承了 WebMvcConfigurationSupport 类(WebMvcConfigurationSupport 注册了 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 等的 bean ,所以说使用了 @EnableWebMvc 后就可以不用再显式地去声明在 WebMvcConfigurationSupport 中所注册的 bean)。
所以说,@EnableWebMvc 自动注册了 RequestMappingHandlerMapping 以及 RequestMappingHandlerAdapter。
关于 RequestMappingHandlerMapping 以及 RequestMappingHandlerAdapter 的作用可以参考 浅析不同的 HandlerMapping 以及 HandlerAdapter 之间的作用以及区别 。
//@EnableWebMvc源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
//DelegatingWebMvcConfiguration 源码
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
public DelegatingWebMvcConfiguration() {
}
@Autowired(
required = false
)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
...
}
//WebMvcConfigurationSupport 源码
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = this.createRequestMappingHandlerMapping();
...
return mapping;
}
...
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = this.createRequestMappingHandlerAdapter();
...
return adapter;
}
...
}
<mvc:annotation-driven />
<mvc:annotation-driven /> 用在 xml 配置文件中,它与 @EnableWebMvc 有点相像,因为它在 Spring 3.2 之后,也将会自动注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
...
<mvc:annotation-driven />
...
</beans>
@EnableWebMvc 与 <mvc:annotation-driven /> 的联系与区别
@EnableWebMvc 与 <mvc:annotation-driven /> 都将自动注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter。
但是 <mvc:annotation-driven /> 在 Spring 3.1 及之前的版本自动注册的不是 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter,而是 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter。
相比之下,@EnableWebMvc 的功能更为强大,因为它不仅仅注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 这两个 bean,还注册了其他的 bean,同时还可以对配置信息进行一些扩展与定制。
最后,希望这篇文章能带给你点启发,Have Fun!