1,Spring MVC自动配置
Spring Boot自动配置好了Spring MVC
以下是SpringBoot对SpringMVC的默认配置(WebMvcAutoConfiguration)
- Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
- 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发和重定向))
- ContentNegotiatingViewResolver :组合所有的视图解析器的
- 可以自定义一个视图解析器给容器,自动的将其组合进来。
- Support for serving static resources, including support for WebJars (see below). 静态资源文件夹路径,webjars。
- Static index.html support. 静态首页访问
- Custom Favicon support (see below). favicon.ico 图标设置
- 自动注册了 Converter , GenericConverter , Formatter beans.
- Converter:转换器。类型转换器使用Converter,如public String hello(User user)。
- Formatter :格式化器。2017.12.17时间字符串转换为Date类型
@Bean @ConditionalOnProperty(prefix = "spring.mvc", name = "date‐format") //在文件中配置日期格式化的规则 public Formatter<Date> dateFormatter() { return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件 }
自定义的格式化转换器,只需要放在容器中即可。
- Support for HttpMessageConverters (see below).
- HttpMessageConverter:SpringMVC用来转换http请求和响应的。对象和json字符串之间的转换。
- HttpMessageConverters 是容器中确定获取所有的HttpMessageConverter。
自定义给容器中添加HttpMessageConverter,只需要将自己的组件注册到容器中(@Bean @Component)
- Automatic registration of MessageCodesResolver (see below). 定义错误代码生成规则
- Automatic use of a ConfigurableWebBindingInitializer bean (see below).
可以配置一个ConfigurableWebBindingInitializer来替换默认的(添加到容器)。
初始化WebDataBinder;
请求数据=====JavaBean;
org.springframework.boot.autoconfigure.web:web的所有自动场景
2,扩展SpringMVC
编写一个配置类(@configuration),实现接口implements WebMvcConfigurer 和继承类extends WebMvcConfigurationSupport 不能标注@EnableWebMvc。以前的版本是extends WebMvcConfigurerAdapter。
但是WebMvcConfigurationSupport只有SpringMVC的基本功能,所以扩展的话最好还是实现WebMvcconfigurer接口。
//使用WebMvcConfigurer可以来扩展SpringMVC的功能 @Configuration public class MyWebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { //浏览器发送/done 请求来到success registry.addViewController("/done").setViewName("success"); } }
原理:
1)WebMvcAutoConfiguration是SpringMVC的自动配置类
2)在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
@Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration { private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite(); //从容器中获取所有的WebMvcConfigurer @Autowired(required = false) public void setConfigurers(List<WebMvcConfigurer> configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.configurers.addWebMvcConfigurers(configurers); //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用; //@Override // public void addViewControllers(ViewControllerRegistry registry) { // for (WebMvcConfigurer delegate : this.delegates) { // delegate.addViewControllers(registry); // } } } }
3)容器中所有的WebMvcConfigurer都会一起起作用
4)自定义的配置类也会被调用
效果:SpringMVC的自动配置和扩展配置都会起作用。
3,全面接管SpringMVC
SpringBoot对SpringMVC的自动配置不需要了,所有都是自己配置,所有的SpringMVC的自动配置都实现。
直接extends WebMvcConfigurationSupport
@Configuration public class MyWebConfig extends WebMvcConfigurationSupport { }
因为MywebConfig继承了WebMvcConfigurationSupport ,然后放到容器中,而导入的WebMvcConfigurationSupport 只有SpringMVC的基本功能。
@Configuration( proxyBeanMethods = false ) @ConditionalOnWebApplication( type = Type.SERVLET ) @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class}) //容器中没有这个组件的时候,这个自动配置类才生效 @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) @AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}) public class WebMvcAutoConfiguration {
4,修改SpringBoot的默认配置
1)SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的;如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来。
2)在SpringBoot中会有非常多的XXXConfigurer帮助我们进行扩展配置
3)在SpringBoot中会有很多的XXXCustomizer帮助我们进行定制配置。