环境:Springboot2.4.12SpringMVC自动配置SpringBoot提供了SpringMVC的自动配置,适用于大多数应用。自动配置在Spring默认值之上添加以下功能:包含ContentNegotiatingViewResolver和BeanNameViewResolverbean。支持提供静态资源,包括对WebJars的支持(在本文档后面描述)。Converter、GenericConverter和Formatterbean的自动注册。支持HttpMessageConverters(在本文档后面介绍)。自动注册MessageCodesResolver(在本文档后面描述)。静态index.html支持。自动使用ConfigurableWebBindingInitializerbean(在本文档后面描述)。如果你想保留那些SpringBootMVC自定义,并做更多的MVC自定义(拦截器、格式化程序、视图控制器和其他功能),你可以添加自己的WebMvcConfigurer类型的@Configuration类,而不是Requires@EnableWebMvc。如果您想提供RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例并仍然保持SpringBootMVC自定义,您可以声明一个WebMvcRegistrations类型的bean并使用它来提供这些组件的自定义实例。上面一段是什么意思?即我们可以自定义一个Class来实现WebMvcRegistrations接口来实现上面自定义的RequestMappingHandlerMapping等相关类。WebMvcRegistrations接口公共接口WebMvcRegistrations{defaultRequestMappingHandlerMappinggetRequestMappingHandlerMapping(){returnnull;}默认RequestMappingHandlerAdaptergetRequestMappingHandlerAdapter(){返回null;}默认ExceptionHandlerExceptionResolvergetExceptionHandlerExceptionResolver(){返回null;}}自动配置又是如何使用(知道)我们自定义这个WebMvcRegistrations类呢?@Configuration(proxyBeanMethods=false)@EnableConfigurationProperties(WebProperties.class)publicstaticclassEnableWebMvcConfigurationextendsDelegatingWebMvcConfigurationimplementsResourceLoaderAware{//注册自定义的WebMvcRegistrationsprivatefinalWebMvcRegistrationsmvcRegistrations;publicEnableWebMvcConfiguration(ObjectProvidermvcRegistrations){//...this.mvcRegistrations=mvcRegistrationsProvider.getIfUnique();}}这里以RequestMappingHandlerMapping为例,说明自动配置如何使用自定义。那么在上面的类中,有如下的方法定义。@Configuration(proxyBeanMethods=false)@EnableConfigurationProperties(WebProperties.class)publicstaticclassEnableWebMvcConfigurationextendsDelegatingWebMvcConfigurationimplementsResourceLoaderAware{@Bean@OverridepublicRequestMappingHandlerAdapterrequestMappingHandlerAdapter(...){//这里调用的不是父类的方法method,createRequestMappingHandlerAdapter//方法会在父类方法中被调用,而这个方法只是被当前类RequestMappingHandlerAdapteradapter=super.requestMappingHandlerAdapter(contentNegotiationManager,conversionService,validator);//...返回适配器;}@OverrideprotectedRequestMappingHandlerAdaptercreateRequestMappingHandlerAdapter(){//判断是否有自定义的WebMvcRegistrations接口if(this.mvcRegistrations!=null){RequestMappingHandlerAdapteradapter=this.mvcRegistrations.getRequestMappingHandlerAdapter();if(adapter!=null){return}适配器返回;super.createRequestMappingHandlerAdapter();}}以上是自动配置实现自定义如何通过RequestMappingHandlerMapping等相关的WebMVC核心组件来完全控制WebMVC的配置?可以添加自己的@Configuration注解@EnableWebMvc,或者自定义配置类@Configuration注解,该类是DelegatingWebMvcConfiguration的子类。如果您想自定义SpringMVC使用的ConversionService,您可以提供一个带有addFormatters方法的WebMvcConfigurerbean。使用此方法,您可以注册任何您喜欢的转换器,或者您可以委托给ApplicationConversionService上可用的静态方法。HttpMessageConvertersSpringMVC使用HttpMessageConverter接口来转换HTTP请求和响应。开箱即用地提供了合理的默认值。例如,对象可以自动转换为JSON(通过使用Jackson库)或XML(通过使用JacksonXML扩展,如果可用),或通过使用JAXB(如果JacksonXML扩展不可用)。默认情况下,字符串是UTF-8编码的。如果需要添加或自定义转换器,可以使用SpringBoot的HttpMessageConverters类,如下所示:HttpMessageConverter>另一个=...returnnewHttpMessageConverters(additional,another);}}自动配置如何使用我们的自定义配置?HandlerAdapter设置HttpMessageConverterpublicclassWebMvcConfigurationSupport{@NullableprivateList>messageConverters;公共RequestMappingHandlerAdapterrequestMappingHandlerAdapter(){RequestMappingHandlerAdapter适配器=createRequestMappingHandlerAdapter();//HandlerAdapter设置消息转发器adapter.setMessageConverters(getMessageConverters());}protectedfinalList>getMessageConverters(){//默认为nullif(this.messageConverters==null){this.messageConverters=newArrayList<>();//该方法在子类中重写,调用子类DelegatingWebMvcConfiguration#configureMessageConverters方法configureMessageConverters(this.messageConverters);if(this.messageConverters.isEmpty()){//添加系统默认消息转换器addDefaultHttpMessageConverters(this.messageConverters);}extendMessageConverters(this.messageConverters);}返回this.messageConverters;}}@Configuration(proxyBeanMethods=false)publicclassDelegatingWebMvcConfigurationextendsWebMvcConfigurationSupport{privatefinalWebMvcConfigurerCompositeconfigurers=newWebMvcConfigurerComposite();//获取容器中所有的自定义的WebMvcConfigurer//会有一个系统提供的配置类WebMvcAutoConfigurationAdapter@Autowired(required=false)publicvoidsetConfigurers(Listconfigurers){if(!CollectionUtils.isEmpty(configurers)){this.configurers.addWebMvcConfigurers(配置器);}}protectedvoidconfigureMessageConverters(List>converters){//分别调用(内部for)WebMvcConfigurer#configureMessageConverters方法this.configurers.configureMessageConverters(converters);}}系统提供的WebMvcConfigurer实现类WebMvcAutoConfigurationAdapterpublicstaticclassWebMvcAutoConfigurationAdapterimplementsWebMvcConfigurer{privatefinalObjectProvidermessageConvertersProvider;publicWebMvcAutoConfigurationAdapter(ObjectProvidermessageConvertersProvider){//...this.messageConvertersProvider=messageConvertersProvider;//...}publicvoidconfigureMessageConverters(List>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注册,但SpringBoot提供了一个替代的@JsonComponent注释,可以更轻松地直接注册Springbean。您可以在JsonSerializer、JsonDeserializer或KeyDeserializer实现中直接使用@JsonComponent注释。您还可以在包含序列化器/反序列化器作为内部类的类上使用它,如下所示:@JsonComponentSomeObject>{//...}}ApplicationContext中的所有@JsonComponentbean都会自动注册到Jackson。因为@JsonComponent是用@Component进行元注释的,所以适用通常的组件扫描规则。SpringBoot还提供了JsonObjectSerializer和JsonObjectDeserializer基类,它们在序列化对象时提供了标准Jackson版本的有用替代方案。