SpringBoot——MVC原理
更多内容,前往 IT-BLOG
一、SpringMVC自动配置
SpringMVC auto-configuration:SpringBoot 自动配置好了SpringMVC。以下是 SpringBoot 对 SpringMVC的默认配置:(WebMvcAutoConfiguration)
【1】包括 ContentNegotiatingViewResolver 和 BeanNameViewResolver 如下:
【2】自动配置了 ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
【3】ContentNegotiatingViewResolver:组合所有的视图解析器的;
【4】如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;
【5】服务对静态资源的支持,静态资源文件夹路径,webjars等。静态首页访问,自定义favicon.ico 图标文件的支持。
【6】自动注册了 of Converter , GenericConverter , Formatter beans;
○ Converter:转换器; public String hello(User user):类型转换使用Converter,String转 int等等。
○ Formatter 格式化器; 2017.12.17===Date,源码如下:可以看到格式可以通过 spring.mvc.date-format调整。
○ 自己添加的格式化器转换器,我们只需要放在容器中即可,上面代码块有演示。
【7】支持 HttpMessageConverters:
○ HttpMessageConverter:SpringMVC用来转换 Http请求和响应的;User用 Json方式写出去;
○ HttpMessageConverters 是从容器中确定;获取所有的 HttpMessageConverter;
○ 自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)
【8】自动注册 MessageCodesResolver,定义错误代码生成规则。自动使用 ConfigurableWebBindingInitializer类;
它是从容器中获取 ConfigurableWebBindingInitializer 的,从而可知,我们可以配置一个 ConfigurableWebBindingInitializer来替换默认的(添加到容器),如果没有配置会初始化一个Web数据绑定器:
【9】org.springframework.boot.autoconfigure.web:web的所有自动场景;上面能够得到的主要思想就是:如何修改Springboot的默认配置,1)、在自动配置很多组件的时候,先看容器中有木有用户自己配置的(@Bean,@Component)如果有就是用用户配置的,如果没有就是用自动配置的,因为底层使用了@ConditionalOnMiss注解来判断,容器中是否已经存在此类配置。2)、如果有些组件可以配置多个,比如视图解析器(ViewResolver)将用户配置的和自己默认的组合起来。
扩展 SpringMVC:官方解释:If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration
class of type WebMvcConfigurer
but without @EnableWebMvc
. If you wish to provide custom instances of RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
, or ExceptionHandlerExceptionResolver
, you can declare a WebMvcRegistrationsAdapter
instance to provide such components.
【1】根据我们之前的配置 xml来进行扩展:
【2】SpringBoot 编写一个配置类(@Configuration),继承 WebMvcConfigurerAdapter类型,不能标注 @EnableWebMvc。 继承抽象类既保留了所有的自动配置,也能用我们扩展的配置;
原理:
【1】WebMvcAutoConfiguration 是 SpringMVC的自动配置类;
【2】在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class);
【3】容器中所有的 WebMvcConfigurer都会一起起作用;
【4】我们的配置类也会被调用;
【5】效果:SpringMVC 的自动配置和我们的扩展配置都会起作用;
二、全面接管SpringMVC
让所有 SpringMVC的自动配置都失效。使用我们需要的配置,需要在配置类中添加 @EnableWebMvc即可。非常不推荐,不然使用 SpringBoot开发干嘛,哈哈。
原理:为什么 @EnableWebMvc自动配置就失效了?
【1】@EnableWebMvc 的核心组合注解:
【2】我们打开上面导入的 DelegatingWebMvcConfiguration 类,会发现其继承了 WebMvcConfigurationSupport。
【3】我们看下 SpringBoot自动配置的文件,发现如下:@ConditionalOnMissingBean(WebMvcConfigurationSupport.class),可知当容器中存在 WebMvcConfigurationSupport类时,就不会导入自动配置的类了,第二步导入的就是这个类。
【4】@EnableWebMvc 将 WebMvcConfigurationSupport 组件导入进来;
【5】导入的 WebMvcConfigurationSupport 只是 SpringMVC最基本的功能;
结论:在 SpringBoot 中会有非常多的 xxxConfigurer 帮助我们进行扩展配置。同时,在 SpringBoot 中也会有很多的xxxCustomizer 帮助我们进行定制配置。