Springboot中对mvc进行扩展


声明:本篇文章所有的内容都是基于***springboot2.2.5***的。

关于springboot对mvc的自动配置见我的另一篇博客:https://blog.****.net/qq_42013590/article/details/104879704

对于已经有的自动配置显然很多时候并不能满足我们的需求,那么我们如何实现对mvc的扩展呢?

观看其他博客结合看源码发现:
1)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
2)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(如:ViewResolver),sprngboot就会将用户配置的和自己默认的组合起来;
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

实现WebMvcConfigurer接口

springboot官方对于mvc的扩展时,建议我们实现WebMvcConfigurer接口,并且要将该实现类加入到容器中。

在以前比如 springboot1.x.x 的时候,我们可以继承WebMvcConfigurerAdapter这个抽象类来完成对mvc的扩展,但是这个类值·全部是对WebMvcConfigurer的空实现,远吗如下:
Springboot中对mvc进行扩展

对于在springboot 2.2.5版本已经废弃了这个类,idea中提示:
Springboot中对mvc进行扩展
所以我们可以直接实现WebMvcConfigurer接口,反正WebMvcConfigurerAdapter也只是全部空实现。

并且WebMvcConfigurer接口中的方法全是default方法(java8之后支持在接口中定义default和static方法),所以我们可以只重写我们需要重写的方法:
Springboot中对mvc进行扩展

我们可以复写这个接口中的default方法实现扩展,比如:
Springboot中对mvc进行扩展
其中编写的我自己的登录拦截器如下所示:
Springboot中对mvc进行扩展

将组件加入到容器中替代默认配置

比如国际化需要的组件LocaleResolver:
Springboot中对mvc进行扩展
可以观察他的注解,只有容器中没有LocaleResolver这个组建的时候才帮我们自动配置,如果我们不想使用springboot的自动配置,我们可以写一个LocaleResolver并加入到容器中,这样默认的就会失效。

步骤一:编写一个自己的LocaleResolver
这个解析器的功能就是从get方式的请求中获取参数,在进行国际化,如下:
Springboot中对mvc进行扩展
步骤二:将国际化解析器加入到容器中
Springboot中对mvc进行扩展
这样就会自动替代springboot帮我们默认实现的。

加入容器中一起生效

对于可以有多个生效的组件,我们只要将我们DIY的加入到容器中即可,例如ViewResolver,查看WebMvcAutoConfiguger:
Springboot中对mvc进行扩展
源码也是非常的体贴,还帮我们写了注释,ContentNegotiatingViewResolver会使用所有其他的视图解析器去定位一个视图,所以他应该有一个高的优先级,也就是会先加载他,他去帮我们调用其他的视图解析器。,之后debug的时候也可以看到。

第一步:编写我自己ViewResolver:
Springboot中对mvc进行扩展
第二步:将自己编写的组件加入到容器中使之生效
Springboot中对mvc进行扩展
第三步:debug查看我们的视图解析器是否生效
DispaterServlet是web的入口,所有的请求都要经过它,其中的核心方法就是doService方法,doService()方法调用的是doDispater()方法,在这里设置一个断点,查看是否生效:
Springboot中对mvc进行扩展
Springboot中对mvc进行扩展
可以观察到我们自己编写的ViewResolver已经加载进来了。