从零开始学习SpringBoot

SpringBoot - SpringMVC自动配置以及原理

2018-05-14  本文已影响61人  BzCoder

双休日过了,学习继续。不学习的人生有什么意义!

一.Spring MVC 自动配置

查阅SpringBoot官方文档,SpringBoot帮我们自动配置了以下组件。

模式小结

  1. SpringBoot在自动配置很多组件的时候,都会先判断用户有没有自己配置(@Bean,@Component),如果有,就使用用户的配置,没有就自动配置。但是有些组件可以有多个(ViewResolver),那么SpringBoot就将用户配置和自己默认的配置组合起来。

二.如何修改SpringBoot的默认配置

1.添加修改SpringBoot的默认配置

官方文档原文:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

解释一下,就是假如你需要扩展配置SpringBoot的话,你只需要创建一个配置类继承,给这个类添加 @Configuration 标注,并继承WebMvcConfigurer ,并且不能有@EnableWebMvc。或者申明一个WebMvcRegistrationsAdapter实例并且将其加入到容器当中。

以下为一种添加配置的示例:

/**
 * @author BaoZhou
 * @date 2018/5/14
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器请求/baozhou,映射到success
        registry.addViewController("/baozhou").setViewName("success");
    }
}

原理:
我们的扩展配置类会和自动配置类放入同一个容器,SpringBoot在装载配置的时候,会将所有配置都取出,所以我们的配置和SpringBoot都会生效。当然,以上代码只是对WebMvc的扩展配置,其他配置可以参考以上模式,只要找到相对应的XXXconfigurer接口进行实现即可。

2.全面托管SpringBoot的默认配置(几乎不用)

继续官方文档:
If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

解释,假如我们要完全自己配置SpringMVC,我只要在我们的配置文件上添加@EnableWebMvc,就可以做到完全托管。实际工作中基本不会用到,但是这里也是通过阅读源码加深下对于SpringBoot的实现方式的理解。
原理:
此处我们看一下源码:

@EnableWebMvc :

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

WebMvcAutoConfiguration:

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //这句很重要
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

我们再来看下DelegatingWebMvcConfiguration.class

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

正是因为@EnableWebMvc导入了WebMvcConfigurationSupport,所以就导致了WebMvcAutoConfiguration的失效。

3.小结

有关于 SpringMVC自动配置以及原理就学习到这里,喜欢的可以点一个赞!

上一篇下一篇

猜你喜欢

热点阅读