SpringBoot擴展SpringMVC原理并實現(xiàn)全面接管
如果想在SpringBoot中擴展一些SpringMVC的配置,例如需要配置自定義的視圖解析器或攔截器等,需要怎么實現(xiàn)呢?
例如,自定義一個視圖解析器:
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}
}
我們只需要編寫一個配置類去實現(xiàn)WebMvcConfigurer接口,并選擇實現(xiàn)接口中的方法,不能標注@EnableWebMvc,這些WebMvcConfigurer接口中的方法就是SpringMVC所可以擴展的配置
注意:在SpringBoot1.0版本中擴展SpringMVC配置是繼承WebMvcConfigurerAdapter類,但在2.0以上的版本中已經(jīng)過時,官方推薦使用以上實現(xiàn)WebMvcConfigurer接口的方式進行擴展,因為在2.0版本中WebMvcConfigurer接口有了默認實現(xiàn)。
WebMvcConfigurer方法介紹:這里只列舉幾個比較關(guān)鍵的方法
public interface WebMvcConfigurer {
//定制URL匹配規(guī)則
default void configurePathMatch(PathMatchConfigurer configurer) {
}
//內(nèi)容協(xié)商機制
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
//異步任務執(zhí)行器。
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
//使用默認servlet處理靜態(tài)資源
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
//添加格式轉(zhuǎn)換器
default void addFormatters(FormatterRegistry registry) {
}
//添加攔截器
default void addInterceptors(InterceptorRegistry registry) {
}
//添加視圖解析器
default void addViewControllers(ViewControllerRegistry registry) {
}
}
擴展MVC的實現(xiàn)原理:
我們都知道WebMvcAutoConfiguration是SpringMVC的自動配置類,當在做其他配置導入時,導入了@Import(EnableWebMvcConfiguration.class)這樣一個注解,這個注解有什么用?
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
}
點進這個注解,發(fā)現(xiàn)他還是WebMvcAutoConfiguration里的一個靜態(tài)內(nèi)部類,但他繼承了DelegatingWebMvcConfiguration
@Configuration(proxyBeanMethods = false)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
}
再點進這個DelegatingWebMvcConfiguration類里,開頭有這樣一段代碼,有一個configurers屬性,類型是WebMvcConfigurerComposite ,這個WebMvcConfigurerComposite類也實現(xiàn)了WebMvcConfigurer,當@Autowired標注在一個方法上說明,這個方法的參數(shù)都從容器中獲取,這里是從容器中獲取所有的WebMvcConfigurer,并賦值給了configurers屬性
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
}
在這個類往下看,發(fā)現(xiàn)這個類的方法跟WebMvcConfigurer接口里的方法一樣,以這個視圖解析器舉例,方法里調(diào)用了這個方法this.configurers.addViewControllers(registry)
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
...
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
this.configurers.addViewControllers(registry);
}
}
點進configurers.addViewControllers(registry),這個方法是把容器中所有的addViewControllers()都執(zhí)行一遍。<mark style="box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;">因為我們自己寫的配置類也注入到了容器里,所以我們的配置也會被調(diào)用,并且也被SpringBoot自動配置上,所以SpringMVC的自動配置和我們的擴展配置都會起作用</mark>;
class WebMvcConfigurerComposite implements WebMvcConfigurer {
...
@Override
public void addViewControllers(ViewControllerRegistry registry) {
for (WebMvcConfigurer delegate : this.delegates) {
delegate.addViewControllers(registry);
}
}
}
還有上面在寫自定義配置類時為什么不能標注@EnableWebMvc
因為一但標注了@EnableWebMvc,所有都是我們自己配置;所有的SpringMVC的自動配置都失效了。<mark style="box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;">原理又是怎么樣的?</mark>
給自己的配置類加上@EnableWebMvc
@Configuration
@EnableWebMvc
public class myConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}
}
這個注解導入了@Import(DelegatingWebMvcConfiguration.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
這個類繼承了WebMvcConfigurationSupport
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
}
我們再回頭看一下WebMvcAutoConfiguration,@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)這個注解的意思就是容器中沒有這個組件的時候,這個自動配置類才生效
小結(jié):大概了解到SpringBoot擴展SpringMVC的原理和全面接管SpringMVC,但SpringBoot中還有其他很多配置,只要了解其中的原理,其他配置也就一通百通了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實現(xiàn)附件預覽(openoffice+swftools+flexpaper)實例
本篇文章主要介紹了java實現(xiàn)附件預覽(openoffice+swftools+flexpaper)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-10-10
使用Java將DOCX文檔解析為Markdown文檔的代碼實現(xiàn)
在現(xiàn)代文檔處理中,Markdown(MD)因其簡潔的語法和良好的可讀性,逐漸成為開發(fā)者、技術(shù)寫作者和內(nèi)容創(chuàng)作者的首選格式,然而,許多文檔仍然以Microsoft Word的DOCX格式保存,本文將介紹如何使用Java和相關(guān)庫將DOCX文檔解析為Markdown文檔,需要的朋友可以參考下2025-04-04
Spring?循環(huán)依賴之AOP實現(xiàn)詳情
這篇文章主要介紹了Spring?循環(huán)依賴之AOP實現(xiàn)詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的盆友可以參考一下2022-07-07
Struts2返回json格式數(shù)據(jù)代碼實例
這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
Tomcat啟動分析(我們?yōu)槭裁匆渲肅ATALINA_HOME環(huán)境變量)
本文主要介紹Tomcat啟動分析的知識,這里整理了相關(guān)資料及分析原因和如何實現(xiàn)的方法,有興趣的小伙伴可以參考下2016-09-09
MyBatis/mybatis-plus項目打印SQL的方法實現(xiàn)
SpringBoot項目中,經(jīng)常需要打印SQL語句及其參數(shù),本文就來介紹一下MyBatis/mybatis-plus項目打印SQL的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-07-07
Java異常--常見方法--自定義異常--增強try(try-with-resources)詳解
這篇文章主要介紹了Java異常--常見方法--自定義異常--增強try(try-with-resources)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
springcloud gateway聚合swagger2的方法示例
這篇文章主要介紹了springcloud gateway聚合swagger2的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

