- 一、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
帮助我们进行定制配置