1. Spring MVC auto-configuration
以下是 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
自动注册了 of Converter, GenericConverter, Formatter beans.
Converter: 转换器; public String hello(User user): 类型转换使用 Converter
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 请求和响应的; User---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 的所有自动场景;
- If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.
- If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.
2, 扩展 SpringMVC
- <mvc:view-controller path="/hello" view-name="success"/>
- <mvc:interceptors>
- <mvc:interceptor>
- <mvc:mapping path="/hello"/>
- <bean></bean>
- </mvc:interceptor>
- </mvc:interceptors>
编写一个配置类(@Configuration), 是 WebMvcConfigurerAdapter 类型; 不能标注 @EnableWebMvc
既保留了所有的自动配置, 也能用我们扩展的配置;
- // 使用 WebMvcConfigurerAdapter 可以来扩展 SpringMVC 的功能
- @Configuration
- public class MyMvcConfig extends WebMvcConfigurerAdapter {
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- // super.addViewControllers(registry);
- // 浏览器发送 /atguigu 请求来到 success
- registry.addViewController("/atguigu").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 的自动配置都失效了
我们需要在配置类中添加 @EnableWebMvc 即可;
- // 使用 WebMvcConfigurerAdapter 可以来扩展 SpringMVC 的功能
- @EnableWebMvc
- @Configuration
- public class MyMvcConfig extends WebMvcConfigurerAdapter {
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- // super.addViewControllers(registry);
- // 浏览器发送 /atguigu 请求来到 success
- registry.addViewController("/atguigu").setViewName("success");
- }
- }
原理:
为什么 @EnableWebMvc 自动配置就失效了;
1)@EnableWebMvc 的核心
- @Import(DelegatingWebMvcConfiguration.class)
- public @interface EnableWebMvc {
- 2),
- @Configuration
- public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
- 3),
- @Configuration
- @ConditionalOnWebApplication
- @ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
- WebMvcConfigurerAdapter.class })
- // 容器中没有这个组件的时候, 这个自动配置类才生效
- @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
- @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
- @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
- ValidationAutoConfiguration.class })
- public class WebMvcAutoConfiguration {
4),@EnableWebMvc 将 WebMvcConfigurationSupport 组件导入进来;
5), 导入的 WebMvcConfigurationSupport 只是 SpringMVC 最基本的功能;
4, 如何修改 SpringBoot 的默认配置
模式:
? 1),SpringBoot 在自动配置很多组件的时候, 先看容器中有没有用户自己配置的 (@Bean,@Component) 如果有就用用户配置的, 如果没有, 才自动配置; 如果有些组件可以有多个 (ViewResolver) 将用户配置的和自己默认的组合起来;
? 2), 在 SpringBoot 中会有非常多的 xxxConfigurer 帮助我们进行扩展配置
? 3), 在 SpringBoot 中会有很多的 xxxCustomizer 帮助我们进行定制配置
来源: http://www.bubuko.com/infodetail-2947228.html