国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

SpringBoot對Spring MVC都做了哪些事?(一)

開發 架構
Spring Boot為Spring MVC提供了自動配置,可以很好地與大多數應用程序配合使用。

環境:Springboot2.4.12

Spring MVC自動配置

Spring Boot為Spring MVC提供了自動配置,可以很好地與大多數應用程序配合使用。

自動配置在Spring默認設置的基礎上添加了以下功能:

  • 包含ContentNegotiatingViewResolverBeanNameViewResolver bean
  • 支持提供靜態資源,包括對WebJars的支持(本文檔后面會講到)。
  • ConverterGenericConverterFormatterbean的自動注冊。
  • HttpMessageConverters的支持(本文檔后面會講到)。
  • 自動注冊MessageCodesResolver(本文檔后面將介紹)。
  • 靜態index.html的支持。
  • 自動使用ConfigurableWebBindingInitializerbean(本文檔后面將介紹)。

如果你想保留那些Spring Boot MVC自定義,并做更多的MVC自定義(攔截器、格式化器、視圖控制器和其他特性),你可以添加你自己的WebMvcConfigurer類型的@Configuration類,但不需要@EnableWebMvc。

如果你想提供RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定義實例,并且仍然保持Spring Boot MVC自定義,你可以聲明一個WebMvcRegistrations類型的bean,并使用它來提供這些組件的自定義實例。

上面這段什么意思?就是我們可以自定義一個Class實現WebMvcRegistrations接口實現自定義的上面的RequestMappingHandlerMapping等相關的類。

WebMvcRegistrations接口

public interface WebMvcRegistrations {
default RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return null;
}
default RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return null;
}
default ExceptionHandlerExceptionResolver getExceptionHandlerExceptionResolver() {
return null;
}
}

自動配置中又是如何使用(知道)我們自定義的這個WebMvcRegistrations 類呢?

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebProperties.class)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
// 注入自定義的WebMvcRegistrations
private final WebMvcRegistrations mvcRegistrations;
public EnableWebMvcConfiguration(ObjectProvider<WebMvcRegistrations> mvcRegistrations) {
// ...
this.mvcRegistrations = mvcRegistrationsProvider.getIfUnique();
}
}

這里RequestMappingHandlerMapping 為例說明自動配置是如何使用自定義的。接著上面的類中,有如下方法定義。

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebProperties.class)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
@Bean
@Override
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(...) {
// 調用父類的方法,這里就不進入父類方法了,父類方法中會調用createRequestMappingHandlerAdapter
// 方法,而此方法正好被當前類重寫了
RequestMappingHandlerAdapter adapter = super.requestMappingHandlerAdapter(contentNegotiationManager, conversionService, validator);
// ...
return adapter;
}
@Override
protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() {
// 判斷是否存在自定義的WebMvcRegistrations接口
if (this.mvcRegistrations != null) {
RequestMappingHandlerAdapter adapter = this.mvcRegistrations.getRequestMappingHandlerAdapter();
if (adapter != null) {
return adapter;
}
}
return super.createRequestMappingHandlerAdapter();
}
}

以上就是自動配置實現自定義RequestMappingHandlerMapping 等相關WebMVC核心組件的方式。

如何完全的自己控制WebMVC的配置呢?

你可以添加自己的@Configuration注釋@EnableWebMvc,或者自定義配置類 @Configuration注釋且此類是DelegatingWebMvcConfiguration的子類。

如果你想定制Spring MVC使用的ConversionService,你可以提供一個帶有addFormatters方法的WebMvcConfigurer bean。通過這個方法,你可以注冊任何你喜歡的轉換器,或者你可以委托給ApplicationConversionService上可用的靜態方法。

HttpMessageConverters

Spring MVC使用HttpMessageConverter接口來轉換HTTP請求和響應。合理的默認值是開箱即用的。例如,可以將對象自動轉換為JSON(通過使用Jackson庫)或XML(通過使用Jackson XML擴展(如果可用),或通過使用JAXB(如果Jackson XML擴展不可用)。缺省情況下,字符串是用UTF-8編碼的。

如果你需要添加或自定義轉換器,你可以使用Spring Boot的HttpMessageConverters類,如下所示:

@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}

自動配置又是如何使用咱們自定義的配置?

  • HandlerAdapter設置HttpMessageConverter
public class WebMvcConfigurationSupport {
@Nullable
private List<HttpMessageConverter<?>> messageConverters;
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
// HandlerAdapter設置消息轉換器
adapter.setMessageConverters(getMessageConverters());
}
protected final List<HttpMessageConverter<?>> getMessageConverters() {
// 默認為null
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<>();
// 該方法在子類中重寫了,調用子類DelegatingWebMvcConfiguration#configureMessageConverters方法
configureMessageConverters(this.messageConverters);
if (this.messageConverters.isEmpty()) {
// 添加系統默認的消息轉換器
addDefaultHttpMessageConverters(this.messageConverters);
}
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}
}
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
// 獲取容器中所有的自定義的WebMvcConfigurer
// 這里會有一個系統提供的配置類WebMvcAutoConfigurationAdapter
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 分別調用(內部for)WebMvcConfigurer#configureMessageConverters方法
this.configurers.configureMessageConverters(converters);
}
}

系統提供的WebMvcConfigurer 實現類WebMvcAutoConfigurationAdapter。

public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
public WebMvcAutoConfigurationAdapter(ObjectProvider<HttpMessageConverters> messageConvertersProvider) {
// ...
this.messageConvertersProvider = messageConvertersProvider;
// ...
}
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 在上面的WebMvcConfigurerComposite#configureMessageConverters方法中會執行該方法。
// 該方法先獲取有效的HttpMessageConverters
// ifAvailable方法接受一個Consumer函數式接口,將HttpMessageConverters#getConverters中的獲取到的
// HttpMessageConverter添加到當前的List集合中
this.messageConvertersProvider.ifAvailable((customConverters) -> converters.addAll(customConverters.getConverters()));
}
}

以上就將自定義的HttpMessageConverter 添加到了容器中。

自定義JSON序列號和反序列化

如果你使用Jackson來序列化和反序列化JSON數據,你可能需要編寫自己的JsonSerializer和JsonDeserializer類。自定義序列化器通常通過模塊注冊到Jackson,但Spring Boot提供了一個替代的@JsonComponent注釋,可以更容易地直接注冊Spring bean。

你可以在JsonSerializer、JsonDeserializer或KeyDeserializer實現中直接使用@JsonComponent注釋。你也可以在包含序列化器/反序列化器作為內部類的類上使用它,如下所示:

@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer<SomeObject> {
// ...
}
public static class Deserializer extends JsonDeserializer<SomeObject> {
// ...
}

}

ApplicationContext中的所有@JsonComponent bean都會自動向Jackson注冊。因為@JsonComponent是用@Component進行元注釋的,所以通常的組件掃描規則也適用。

Spring Boot還提供了JsonObjectSerializer和JsonObjectDeserializer基類,它們在序列化對象時提供了標準Jackson版本的有用替代方案。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-29 09:12:14

Springservlet容器

2022-08-02 07:55:28

MVCJersey

2022-07-26 07:47:47

SpringMVC

2021-01-06 08:24:38

人工智能消費領域AI

2020-12-08 09:30:25

CPU內存I

2021-07-16 09:58:02

物聯網

2017-11-13 15:48:36

架構Spring Clou演進

2017-11-14 09:03:36

Spring Clou架構演進

2014-08-10 14:35:23

2021-08-06 22:45:09

人工智能AI

2017-06-08 09:36:42

京東服務器

2022-05-19 07:01:34

架構

2023-06-07 08:13:46

PixiJSCanvas 庫

2021-01-03 10:37:50

前端開發技術

2019-02-24 23:45:42

5G運營商網絡

2019-12-09 09:50:18

程序員技能開發者

2014-11-12 00:01:29

京東

2019-05-14 09:18:18

程序員PythonJava

2017-06-26 14:52:45

微軟智能云合作

2014-03-26 14:23:36

Microsoft AWindows Azu微軟
點贊
收藏

51CTO技術棧公眾號

欧美一级二级三级视频| 蓝色福利精品导航| 色吊一区二区三区| 成人av在线播放观看| 日韩精品福利一区二区三区| 精品av综合导航| 美乳中文字幕| 91在线云播放| 亚洲综合另类| 一本大道色婷婷在线| 伊人一区二区三区久久精品| 亚洲色图视频网站| 夜夜嗨一区二区| 偷拍日韩校园综合在线| 麻豆91蜜桃| 国产精品毛片视频| 日韩在线免费高清视频| 伊人在线视频| 日本伊人午夜精品| 国产精品福利观看| www.成人在线.com| 亚洲精品美女久久久久| 黄色片在线看| 中文字幕av日韩| 牛牛澡牛牛爽一区二区| 中文字幕免费精品一区| 天堂社区 天堂综合网 天堂资源最新版 | 精品亚洲一区二区三区四区| 久久无码高潮喷水| 欧美一区二区三区免费视频| 成人在线免费观看av| 午夜视黄欧洲亚洲| eeuss影院95999部| 国产亚洲一区二区手机在线观看| 日韩一区和二区| 黄色毛片在线观看| 欧美性xxxxhd| 神马久久精品| 一本色道亚洲精品aⅴ| 在线中文字幕观看| 欧美日韩在线影院| 欧美一区二区少妇| 欧美在线观看视频一区二区| 成人午夜电影在线观看| 色就色 综合激情| 污视频网站在线| 一本大道av伊人久久综合| 青青草在线视频免费观看| 日本精品一区二区三区四区的功能| 你懂得在线网址| 欧美日韩免费一区二区三区视频| 欧美性天天影视| 欧美岛国在线观看| 一区二区电影免费观看| 色综合伊人色综合网站| 亚洲3区在线| 欧美在线视频网站| 亚洲成人av| 欧美一级二级三级九九九| 久久精品久久99精品久久| 亚洲色图都市激情| 久久精品亚洲精品国产欧美kt∨| www.99com| 色悠久久久久综合欧美99| 影音先锋在线视频| 日韩性xxxx爱| 精品欧美久久| 久久综合婷婷综合| 国产成人综合网| 国产一区二区在线免费播放| 亚洲国产精品麻豆| 最新超碰在线| 久久久极品av| 精品国产乱码久久久久久蜜坠欲下 | 视频一区在线| 国产精品偷伦视频免费观看国产| 一本一道久久综合狠狠老| 欧美视频小说| 91视频一区二区| 最近中文字幕在线| 精品乱人伦小说| 丁香五月缴情综合网| 福利视频久久| 成人短视频下载| 一区 二区 三区| 日韩久久免费电影| 国产欧美日韩在线一区二区| 欧美18视频| 中文字幕中文字幕在线一区| 免费在线看a| 久久久国产一区二区三区| 天天影视综合| 日本一本中文字幕| 无码av中文一区二区三区桃花岛| 欧美三级网站| 国产日韩在线视频| 国产九九视频一区二区三区| 成人a视频在线| 哺乳挤奶一区二区三区免费看| 国产精品久久久久久久久久免费 | 精品1区2区3区| 国产原创一区| 99在线免费观看视频| 2020国产精品自拍| 黄在线免费看| 欧美专区国产专区| 狠狠狠色丁香婷婷综合激情| 在线播放三级网站| 按摩亚洲人久久| 99亚洲伊人久久精品影院红桃| 性猛交ⅹ×××乱大交| 亚洲级视频在线观看免费1级| 欧州一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 色婷婷亚洲综合| 风间由美中文字幕在线看视频国产欧美 | 超级碰碰视频| 亚洲午夜精品视频| 亚洲视频免费| 2018av男人天堂| 中文字幕亚洲二区| 裸体素人女欧美日韩| 天天在线女人的天堂视频| 欧美国产日韩二区| 国产真实乱子伦精品视频| 国产小视频福利在线| 97精品一区二区三区| 丁香婷婷深情五月亚洲| av网站导航在线观看免费| 91精品久久久久久久久久入口 | 久久久久久国产精品| 韩国精品久久久| 欧美日韩在线看片| 成人国产精品久久久久久亚洲| 国产精品乱码人人做人人爱| 黑人一区二区三区| 性生活免费观看视频| 欧美成人高清电影在线| 亚洲欧洲综合| 国产三级电影在线观看| 国产欧美久久久久久| 亚洲精品视频在线看| 国产精品久久久久久久久久白浆| www.av毛片| 在线日韩精品视频| 久久精品久久99精品久久| 69xxx在线| 日本一区高清不卡| 欧美日韩一区精品| 欧美视频久久| 尤物网址在线观看| 国产一区二区三区色淫影院| 91精品91久久久中77777| 久久国产精品成人免费观看的软件| www.1024| 日韩av日韩在线观看| 亚洲欧美区自拍先锋| www.成人网| 久久99爱视频| 97视频免费看| 亚洲人成影院在线观看| 日韩在线黄色| 中文字幕毛片| 亚洲一区二区在线播放| 91九色最新地址| 亚洲欧美日韩国产综合精品二区| 色的视频在线免费看| 女女同性女同一区二区三区91| 亚洲成avwww人| 丰满亚洲少妇av| 亚洲va欧美va人人爽成人影院| 97碰碰碰免费公开在线视频| 国产精品中文字幕久久久| 一本一道波多野结衣一区二区| 亚洲免费婷婷| missav|免费高清av在线看| 亚洲小说欧美另类激情| 精品国产依人香蕉在线精品| 欧美极品少妇xxxxⅹ高跟鞋 | 久久精品国产99国产精品| av日韩电影| 亚洲色图38p| 国产精品一区二区久久久| 欧美日韩高清不卡| 久久精品国产成人一区二区三区| 福利一区二区免费视频| 日日噜噜夜夜狠狠| 日本人成精品视频在线| 在线观看av不卡| 国产一区二区在线影院| theporn国产在线精品| 蜜桃成人在线视频| 热这里只有精品| 欧美性受xxxx白人性爽| 欧美这里有精品| 国产成人av一区二区三区在线| 一本久久青青| jizz一区二区三区| 成年人福利视频| 欧美激情国产日韩|