@EnableWebMvc 与 <mvc : annotation-driven /> 的联系与区别

AUTHOR | nicechi
类别 | Spring MVC
发表 | 2019-09-13 15:13:01
更新 | 2020-08-05 21:29:08

@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!

 


CATEGORY

TOP