以下是Spring Boot 对 Spring MVC 的自动配置 : (WebMvcAutoConfiguration)
ContentNegotiatingViewResolver
and BeanNameViewResolver
beans. //自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染);
//ContentNegotiatingViewResolver
: 组合所有的视图解析器的
//如何定制 : 可以自己给容器中添加一个视图解析器,自动的将其组合进来;
index.html
support. //静态首页访问Favicon
support (see below). //favicon.ico(浏览器小图标)自动注册了Converter
, GenericConverter
, Formatter
beans.//Converter : 转换器 --- public String hello(User user) : 类型转换使用Converter
//Formatter : 格式化器 --- 2019/01/01===Date
@Bean
@ConditionalOnProperty(
prefix = "spring.mvc",
name = {"date-format"}
)//在文件中配置日期格式化的规则
public Formatter dateFormatter() {
return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
}
//自己添加的格式化器,转换器,只需要放在容器中即可
HttpMessageConverters
(see below).//HttpMessageConverters : SpringMVC用来转换Http请求和响应的 ;
//HttpMessageConverters 是从容器中确定的 ; 获取所有的HttpMessageConverter ;
//自己给容器中添加HttpMessageConverter , 只需要将自己的组件注册在容器中(@Bean , @Component)
MessageCodesResolver
(see below). //定义错误代码生成规则的ConfigurableWebBindingInitializer
bean (see below). //可以配置一个 ConfigurableWebBindingInitializer
来替换默认的 ; (添加到容器)
初始化WebDataBinder ;
请求数据=====JavaBean
org.springframework.boot.autoconfigure.web : web的所有自动配置场景
编写一个配置类( @Configuration ) , 是WebMvcRegistrationsAdapter类型 ; 不能标注@EnableWebMvc
既保留了所有的自动配置 , 也能用扩展的配置 :
//使用WebMvcConfigurerAdapter可以扩展SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//浏览器发送 /myweb 请求 来到success页面
registry.addViewController("/myweb").setViewName("success");
}
}
原理 :
1.WebMvcAutoConfiguration是Spring MVC 的自动配置类
2.在做其他自动配置时会导入 : @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
//从容器中获取所有的WebmvConfigurer
@Autowired(
required = false
)
public void setConfigurers(List configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
//一个参考实现 : 将所有的WebMvcConfigurer 相关的配置都来一起调用 ;
//public void addViewControllers(ViewControllerRegistry registry) {
// Iterator var2 = this.delegates.iterator();
// while(var2.hasNext()) {
// WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
// delegate.addViewControllers(registry);
// }
//}
}
}
}
3.容器中所有的 WebMvcConfigurer 都会一起起作用 ;
4.自己的配置类也会被调用 ;
效果 : Spring MVC 的自动配置和扩展配置都会起作用 ;
SpringBoot 对 Spring MVC 的自动配置不需要了 , 所有的都是自己配 , 同时所有 SpringMVC 的自动配置都失效了 ;
只需要在配置类中添加 @EnableWebMvc 即可;
//使用WebMvcConfigurerAdapter可以扩展SpringMVC的功能
@EnableWebMvc
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//浏览器发送 /myweb 请求 来到success页面
registry.addViewController("/myweb").setViewName("success");
}
}
原理 :
1. @EnableWebMvc的核心
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
2.点击进入DelegatingWebMvcConfiguration
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {...}
3.再看WebMvcAutoConfiguration
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({Servlet.class, DispatcherServlet.class,WebMvcConfigurerAdapter.class})
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {...}
4.@EnableWebMvc 将 WebMvcConfigurationSupport组件导入进来 ;
5.导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能 ;
详情见官方文档 : https://docs.spring.io/spring-boot/docs/1.5.20.RELEASE/reference/htmlsingle/