- 一、SpringMVC自动配置
- 1、自动配置在Spring的默认值之上添加了以下功能
- 二、视图解析器
- 三、转换器和格式化器
- 四、HttpMessageConverters
- 五、 扩展SpringMVC
- 六、全面接管SpringMVC
- 七、如何修改SpringBoot的默认配置
跳转到目录
-
SpringBoot对我们的
SpringMVC做了哪些配置,包括如何扩展,如何定制。 只有把这些都搞清楚了,我们在之后使用才会更加得心应手。 -
途径一:源码分析,途径二:官方文档!
-
Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。
-
以下是SpringBoot对SpringMVC的默认配置
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
跳转到目录
- 包含
ContentNegotiatingViewResolver和BeanNameViewResolver。–> 视图解析器 - 支持服务静态资源,包括对WebJars的支持(
官方文档中有介绍)。–> 静态资源文件夹路径 - 自动注册
Converter,GenericConverter和Formatterbeans。–> 转换器,格式化器 - 支持
HttpMessageConverters(官方文档中有介绍)。–> SpringMVC用来转换Http请求和响应的;User—JSON; - 自动注册
MessageCodesResolver(官方文档中有介绍)。–> 定义错误代码生成规则 - 静态
index.html支持。–> 静态首页访问 - 定制
Favicon.ioc支持(官方文档中有介绍)。–> 网站图标 - 自动使用
ConfigurableWebBindingInitializerbean(官方文档中有介绍)。
如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC配置(拦截器,格式化程序和视图控制器等),可以添加自己的 WebMvcConfigurer类型的 @Configuration 类,但不能带 @EnableWebMvc 注解。如果您想自定义 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 或者 ExceptionHandlerExceptionResolver 实例,可以声明一个 WebMvcRegistrationsAdapter 实例来提供这些组件。
如果您想完全掌控 Spring MVC,可以添加自定义注解了 @EnableWebMvc 的 @Configuration 配置类。
跳转到目录 视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
- 自动配置了ViewResolver
- ContentNegotiatingViewResolver:组合所有的视图解析器的;
首先进入WebMvcAutoConfiguration配置类, 找到ContentNegotiatingViewResolver
获取所有的候选视图 视图解析器从哪里来的呢?
所以我们可以自己给容器中添加一个视图解析器;通过mvc的自动配置就可以自动的将其组合进来
自定义一个视图解析器,并添加到容器中,mvc会自动将这个视图解析器,添加到候选视图解析器中
@SpringBootApplication
public class Springboot04WebApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot04WebApplication.class, args);
}
@Bean
public ViewResolver myViewReolver() {
return new MyViewResolver();
}
private static class MyViewResolver implements ViewResolver {
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
所有的请求都会通过DispatcherServlet的doDispatch, 可以在这里打个断点, 查看所有的视图解析器;
跳转到目录
Converter:转换器; public String hello(User user):类型转换使用Converter(表单数据转为user)Formatter: 格式化器; 2017.12.17===Date;
找到格式化转换器
点进getDateFormat()方法 可以看到在我们的
XxxProperties文件中,我们可以进行自动配置它! 如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则:
添加格式化器
也就是说我们自己添加的格式化器转换器, 我们只需要放在容器中即可!
四、HttpMessageConverters跳转到目录
-
HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User—JSON(将JavaBean 转为 JSON数据);
-
HttpMessageConverters是从容器中确定;获取所有的HttpMessageConverter;自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component等注册方式)
跳转到目录
- 以前的配置文件中的配置
- 现在使用SpringBoot的方式来替代上面配置文件中的配置,需要扩展SpringMVC;
现在,编写一个配置类(@Configuration),是WebMvcConfigurer类型;不能标注@EnableWebMvc 既保留了所有的自动配置,也能用我们扩展的配置;
我们要做的就是编写一个@Configuration注解类,并且类型要为WebMvcConfigurer,还不能标注@EnableWebMvc注解; 我们去自己写一个;我们新建一个包叫config,写一个类MyMvcConfig;
// 配置类
@Configuration
// 使用WebMvcConfigurer用来扩展SpringMVC的功能
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 浏览器发送/sunny请求,就会来到test页面(也是通过模板引擎(thymeleaf)解析的)
registry.addViewController("/sunny").setViewName("test");
}
}
这样一来, 我们就没必要在写; 通过上面的方式就可以实现视图映射了
原理:
- 我们知道WebMvcAutoConfiguration是SpringMVC的自动配置类
- 下面这个类是WebMvcAutoConfiguration中的一个内部类
- 看一下
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})中的这个类, 这个类依旧是WebMvcAutoConfiguration中的一个内部类 - 重点看一下这个类继承的父类
DelegatingWebMvcConfiguration
自动注入,从容器中获取所有的WebMvcConfigurer
容器中所有的WebMvcConfigurer都会一起起作用; 我们的配置类也会被调用;
效果:SpringMVC的自动配置和我们的扩展配置都会起作用;
跳转到目录
-
SpringBoot对SpringMVC的自动配置不需要了,所有都是由我们自己来配置;所有的SpringMVC的自动配置都失效了
-
我们只需要在配置类中添加
@EnableWebMvc即可;
原理:
-
为什么@EnableWebMvc自动配置就失效了;
-
我们看一下EnableWebMvc注解类
-
重点在于
@Import({DelegatingWebMvcConfiguration.class}) -
DelegatingWebMvcConfiguration是WebMvcConfigurationSupport的子类
我们再来看一下springmvc的自动配置类WebMvcAutoConfiguration
DelegatingWebMvcConfiguration是WebMvcConfigurationSupport的子类, 所以整个WebMvcAutoConfiguration配置类都没有生效了!
所以: @EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;所以像视图解析器, 格式化器 等都失效了, 需要我们自己手动配置!
七、如何修改SpringBoot的默认配置跳转到目录 模式:
-
SpringBoot在自动配置很多组件的时候,先看容器中
有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来; -
在SpringBoot中会有非常多的
xxxConfigurer帮助我们进行扩展配置 -
在SpringBoot中会有很多的
xxxCustomizer帮助我们进行定制配置
