日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot擴(kuò)展SpringMVC原理并實(shí)現(xiàn)全面接管

瀏覽:112日期:2023-04-11 17:41:10

如果想在SpringBoot中擴(kuò)展一些SpringMVC的配置,例如需要配置自定義的視圖解析器或攔截器等,需要怎么實(shí)現(xiàn)呢?例如,自定義一個(gè)視圖解析器:

@Configurationpublic class MyConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController('/index').setViewName('index'); }}

我們只需要編寫(xiě)一個(gè)配置類去實(shí)現(xiàn)WebMvcConfigurer接口,并選擇實(shí)現(xiàn)接口中的方法,不能標(biāo)注@EnableWebMvc,這些WebMvcConfigurer接口中的方法就是SpringMVC所可以擴(kuò)展的配置

注意:在SpringBoot1.0版本中擴(kuò)展SpringMVC配置是繼承WebMvcConfigurerAdapter類,但在2.0以上的版本中已經(jīng)過(guò)時(shí),官方推薦使用以上實(shí)現(xiàn)WebMvcConfigurer接口的方式進(jìn)行擴(kuò)展,因?yàn)樵?.0版本中WebMvcConfigurer接口有了默認(rèn)實(shí)現(xiàn)。

WebMvcConfigurer方法介紹:這里只列舉幾個(gè)比較關(guān)鍵的方法

public interface WebMvcConfigurer { //定制URL匹配規(guī)則 default void configurePathMatch(PathMatchConfigurer configurer) { } //內(nèi)容協(xié)商機(jī)制 default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } //異步任務(wù)執(zhí)行器。 default void configureAsyncSupport(AsyncSupportConfigurer configurer) { } //使用默認(rèn)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) { }}

擴(kuò)展MVC的實(shí)現(xiàn)原理:

我們都知道WebMvcAutoConfiguration是SpringMVC的自動(dòng)配置類,當(dāng)在做其他配置導(dǎo)入時(shí),導(dǎo)入了@Import(EnableWebMvcConfiguration.class)這樣一個(gè)注解,這個(gè)注解有什么用?

@Configuration(proxyBeanMethods = false)@Import(EnableWebMvcConfiguration.class)@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })@Order(0)public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {}

點(diǎn)進(jìn)這個(gè)注解,發(fā)現(xiàn)他還是WebMvcAutoConfiguration里的一個(gè)靜態(tài)內(nèi)部類,但他繼承了DelegatingWebMvcConfiguration

@Configuration(proxyBeanMethods = false)public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {}

再點(diǎn)進(jìn)這個(gè)DelegatingWebMvcConfiguration類里,開(kāi)頭有這樣一段代碼,有一個(gè)configurers屬性,類型是WebMvcConfigurerComposite ,這個(gè)WebMvcConfigurerComposite類也實(shí)現(xiàn)了WebMvcConfigurer,當(dāng)@Autowired標(biāo)注在一個(gè)方法上說(shuō)明,這個(gè)方法的參數(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); } }}

在這個(gè)類往下看,發(fā)現(xiàn)這個(gè)類的方法跟WebMvcConfigurer接口里的方法一樣,以這個(gè)視圖解析器舉例,方法里調(diào)用了這個(gè)方法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); }}

點(diǎn)進(jìn)configurers.addViewControllers(registry),這個(gè)方法是把容器中所有的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;'>因?yàn)槲覀冏约簩?xiě)的配置類也注入到了容器里,所以我們的配置也會(huì)被調(diào)用,并且也被SpringBoot自動(dòng)配置上,所以SpringMVC的自動(dòng)配置和我們的擴(kuò)展配置都會(huì)起作用</mark>;

class WebMvcConfigurerComposite implements WebMvcConfigurer { ... @Override public void addViewControllers(ViewControllerRegistry registry) { for (WebMvcConfigurer delegate : this.delegates) {delegate.addViewControllers(registry); } }}

還有上面在寫(xiě)自定義配置類時(shí)為什么不能標(biāo)注@EnableWebMvc

因?yàn)橐坏珮?biāo)注了@EnableWebMvc,所有都是我們自己配置;所有的SpringMVC的自動(dòng)配置都失效了。<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@EnableWebMvcpublic class myConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController('/index').setViewName('index'); }}

這個(gè)注解導(dǎo)入了@Import(DelegatingWebMvcConfiguration.class)

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(DelegatingWebMvcConfiguration.class)public @interface EnableWebMvc {}

這個(gè)類繼承了WebMvcConfigurationSupport

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {}

我們?cè)倩仡^看一下WebMvcAutoConfiguration,@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)這個(gè)注解的意思就是容器中沒(méi)有這個(gè)組件的時(shí)候,這個(gè)自動(dòng)配置類才生效

小結(jié):大概了解到SpringBoot擴(kuò)展SpringMVC的原理和全面接管SpringMVC,但SpringBoot中還有其他很多配置,只要了解其中的原理,其他配置也就一通百通了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线视频观看日韩17c| 婷婷亚洲五月色综合| 国产精品色网| 午夜国产一区二区| 日韩视频免费| 国产盗摄——sm在线视频| 国产一区不卡| 国产 日韩 欧美 综合 一区| 成人自拍av| 六月婷婷一区| 欧美有码在线| 国产一区国产二区国产三区| 国产一区二区三区成人欧美日韩在线观看| 国产不卡人人| 99在线精品视频在线观看| 免费日韩一区二区| 色综合视频一区二区三区日韩| 国产精品一区二区99| 在线一区av| 免费久久精品视频| 日韩专区欧美专区| 国产精品一区免费在线| 国产不卡人人| 亚洲综合三区| 国产精品久久亚洲不卡| 日韩久久精品网| 日韩中文字幕av电影| 国产精品xvideos88| 久久天堂精品| 日韩欧美中文字幕电影| 国产夫妻在线| 日韩精品一二三| 国产高清视频一区二区| 在线日韩电影| 欧美日韩99| 国产精品videossex| 99久久夜色精品国产亚洲1000部| 亚洲免费一区三区| 国产精品成久久久久| 亚洲国产一区二区三区在线播放 | 美国三级日本三级久久99| 欧美aaaaaa午夜精品| 婷婷综合激情| 国产一区二区三区四区二区| 免费人成在线不卡| 天堂√8在线中文| 综合亚洲自拍| 久久精品亚洲欧美日韩精品中文字幕| 尹人成人综合网| 精品亚洲a∨| 视频一区日韩| 久久国产中文字幕| 精品久久99| 日本不卡一二三区黄网| 欧美日韩在线二区| 精品欠久久久中文字幕加勒比| 亚洲一区日韩| 免费在线小视频| 欧美久久香蕉| 亚洲欧美日韩视频二区| 岛国av免费在线观看| 久久国产视频网| 日韩视频中文| 国产成人黄色| 日韩动漫一区| 欧美日韩国产高清电影| 国产成人精品福利| 欧美成人一二区| 日韩成人一级| 亚洲综合三区| 亚洲经典在线| 亚洲午夜精品久久久久久app| 欧美丰满日韩| 精品一区视频| 国产欧美综合一区二区三区| 久久亚洲二区| 蜜桃久久av| 国产专区一区| 久久精品国产99国产| 日韩高清一区在线| 婷婷成人av| 蜜桃久久久久久| 亚洲欧美久久久| 不卡中文字幕| 99久久夜色精品国产亚洲狼| 色黄视频在线观看| 欧美韩日一区| 日韩一区电影| 精精国产xxxx视频在线播放| 久久精品国产精品亚洲毛片| 国产精品红桃| 老司机精品视频网| 国产精品115| 91成人精品观看| 日本一区二区中文字幕| 日韩精品一区二区三区中文 | 久久av日韩| 欧美精品成人| 国产+成+人+亚洲欧洲在线| 久久精品一本| 中文字幕在线免费观看视频| 麻豆成人av在线| 91视频一区| 麻豆精品蜜桃| 午夜久久美女| 欧美日韩国产欧| 国产精品88久久久久久| 国产精品美女| 亚洲精品乱码日韩| 国产欧美日韩一级| 91一区二区| 日韩专区精品| 欧美一区=区| 日韩精品国产精品| 国产精品对白| 天堂av在线| 欧美特黄一区| 日韩不卡手机在线v区| 精品日韩一区| 欧美影院三区| 亚洲激情不卡| 亚洲三级视频| 精品丝袜久久| 999精品一区| 在线精品观看| 久久中文字幕一区二区三区| 成人高清一区| 欧美女激情福利| 欧美亚洲人成在线| 日韩1区2区| 亚洲欧美网站| 国产美女亚洲精品7777| 日韩欧美精品综合| 免费黄网站欧美| 久久精品免费看| 中文一区一区三区高中清不卡免费| 亚洲爱爱视频| 亚洲天堂免费| 91视频久久| 亚洲精品动态| 三级精品视频| 日本不卡视频在线| 日韩中文在线电影| 日韩中文字幕| 99精品一区| 国产精品久久久久av蜜臀| 日韩国产在线| 日韩av三区| 欧美1级日本1级| 欧美激情aⅴ一区二区三区| 日韩欧美二区| 91精品丝袜国产高跟在线| 麻豆视频在线观看免费网站黄 | 欧美.日韩.国产.一区.二区 | 日韩高清不卡一区| 久久亚洲国产| 久久激情综合网| 尤物在线精品| 国产欧美日韩一级| 99视频精品免费观看| 久久精品毛片| 中文字幕亚洲在线观看| 999国产精品999久久久久久| 国产精品午夜av| 久久不射中文字幕| 精品日韩视频| 美女在线视频一区| 亚洲一区成人| 日韩成人亚洲| 精品国内亚洲2022精品成人| 最新国产精品久久久| 欧美日韩精品在线一区| 国产精品**亚洲精品| 国产精品色网| av高清一区| 精品视频黄色| 日韩av成人高清| 丝瓜av网站精品一区二区| 麻豆理论在线观看| 国产精品一在线观看| 四虎精品永久免费| 国产女优一区| 精品在线播放| 久久婷婷一区| 国产999精品在线观看| 久久wwww| 国产欧美久久一区二区三区| 中文字幕一区二区三区四区久久| 国产日韩电影| 国产欧美亚洲精品a| 日韩一区精品| 日本在线视频一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 欧美日韩一二| 国产精品久久久久av电视剧| a国产在线视频| 91欧美在线| 亚洲啊v在线| 久久久人人人| 久久精品国产亚洲夜色av网站|