自定义WebmvcConfigurer能实现管理什么

在 Spring 框架中,WebMvcConfigurer接口是一个非常重要的配置接口,它允许开发者通过自定义配置来扩展和定制 Spring MVC 的默认行为。通过实现WebMvcConfigurer接口(或继承WebMvcConfigurationSupport类),可以对 Spring MVC 的多个核心功能进行灵活配置。

以下是自定义WebMvcConfigurer能实现的主要功能及详细说明:

请求映射与处理器配置

  1. 自定义处理器映射(HandlerMapping)和适配器(HandlerAdapter)

    • 可以注册自定义的HandlerMapping(如基于注解的RequestMappingHandlerMapping)或HandlerAdapter(如RequestMappingHandlerAdapter),用于处理不同类型的请求映射逻辑。
    • 场景:自定义 URL 匹配规则、处理特殊请求格式(如 RESTful API 版本控制)。
  2. 静态资源处理

    • 配置静态资源(如 HTML、CSS、JS、图片等)的访问路径和缓存策略:

      1
      2
      3
      4
      5
      6
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
      registry.addResourceHandler("/static/**")
      .addResourceLocations("classpath:/static/")
      .setCachePeriod(3600); // 缓存1小时
      }
    • 场景:将静态资源映射到类路径、文件系统路径或 CDN 地址。

视图与数据格式化

  1. 视图解析器配置

    • 注册自定义视图解析器(如 Thymeleaf、FreeMarker、JSP 等),或修改默认视图解析规则:

      1
      2
      3
      4
      @Override
      public void configureViewResolvers(ViewResolverRegistry registry) {
      registry.jsp("/WEB-INF/views/", ".jsp"); // JSP视图解析器
      }
    • 场景:使用模板引擎时配置视图前缀、后缀或自定义视图解析逻辑。

  2. 数据格式化与转换

    • 注册自定义的Converter(类型转换器)和Formatter(格式化器),处理请求参数和响应结果的类型转换:

      1
      2
      3
      4
      @Override
      public void addFormatters(FormatterRegistry registry) {
      registry.addConverter(String.class, LocalDate.class, new StringToLocalDateConverter());
      }
    • 场景:将字符串参数自动转换为LocalDateEnum等类型,或格式化日期、数字等响应数据。

拦截器与请求处理

  1. 拦截器注册

    • 配置拦截器(HandlerInterceptor),用于预处理请求或后处理响应:

      1
      2
      3
      4
      5
      6
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new LoginInterceptor())
      .addPathPatterns("/api/**") // 拦截路径
      .excludePathPatterns("/api/public/**"); // 排除路径
      }

      场景:实现登录认证、请求日志记录、性能监控等功能。

  2. 跨域请求处理(CORS)

    • 配置跨域资源共享(CORS)规则,允许前端跨域访问后端 API:
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
    .allowedOrigins("https://example.com")
    .allowedMethods("GET", "POST", "PUT", "DELETE")
    .allowedHeaders("*")
    .maxAge(3600);
    }
    • 场景:前后端分离项目中解决跨域访问限制。

请求处理与参数配置

  1. 请求参数处理

    • 配置RequestBodyRequestParam的解析规则,如设置 JSON 解析器(Jackson)、表单解析器等:

      1
      2
      3
      4
      5
      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
      // 添加自定义JSON转换器
      converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
      }

      场景:自定义请求体解析(如处理特殊格式的 JSON、XML)或响应数据序列化规则

  2. 异步请求处理

    • 配置异步请求处理(如DeferredResult、WebSocket)的相关参数:

      1
      2
      3
      4
      5
      @Override
      public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
      configurer.setDefaultTimeout(30000); // 异步请求超时时间
      configurer.registerCallableInterceptors(new TimeoutCallableInterceptor());
      }
    • 场景:实现长轮询、WebSocket 通信等异步业务场景。

RESTful API 特性增强

  1. 内容协商(Content Negotiation)

    • 配置不同请求 Accept 头对应的响应格式(如 JSON、XML、HTML)

      1
      2
      3
      4
      5
      6
      7
      @Override
      public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
      configurer.favorPathExtension(true) // 基于URL后缀(.json/.xml)
      .favorParameter(true) // 基于参数(?format=json)
      .parameterName("format")
      .defaultContentType(MediaType.APPLICATION_JSON);
      }

      场景:根据客户端请求头返回不同格式的数据,提升 API 兼容性。

  2. HTTP 消息转换器

    • 自定义HttpMessageConverter,处理请求和响应的消息转换(如添加 Protobuf、CSV 支持):

      1
      2
      3
      4
      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
      converters.add(new ProtobufHttpMessageConverter());
      }

其他功能扩展

  1. 异常处理配置
    • 注册全局异常处理器(@ControllerAdvice+@ExceptionHandler),或通过WebMvcConfigurer间接配置:
    • 场景:统一处理 API 异常,返回标准化错误响应。
  2. 默认 Servlet 处理
    • 配置 Spring MVC 对默认 Servlet(如 Tomcat 的默认 Servlet)的处理策略:
    • 场景:处理静态资源请求时,若 Spring MVC 未匹配到对应处理器,交由容器默认 Servlet 处理。

自定义 WebMvcConfigurer

配置类的三种自定义方式

全自动 直接编写控制器逻辑 全部使用自动配置默认效果
手自一体 @Configuration + 配置 WebMvcConfigurer + 配置 WebMvcRegistrations 不要标注@EnableWebMvc 自动配置效果 手动设置部分功能 定义 MVC 底层组件
全手动 @Configuration + 配置 WebMvcConfigurer 标注@EnableWebMvc 禁用自动配置效果 全手动设置

总结:所有的自定义模式,给容器类放一个配置类 @Configuration 实现 WebMvcConfigurer,不要标注@EnableWebMvc注解,实现了手自一体的模式。

一些问题

  1. @EnableWebMvc的影响
    • 若配置类添加@EnableWebMvc,会完全覆盖 Spring MVC 的自动配置(如默认视图解析器、消息转换器等),需手动配置所有需要的功能。
    • 若仅需扩展部分功能,建议不添加@EnableWebMvc,保持 Spring Boot 的自动配置。
  2. 优先级与顺序
    • 多个WebMvcConfigurer实现类的配置会合并生效,可通过@Order注解控制优先级。
  3. WebMvcConfigurationSupport的区别
    • WebMvcConfigurationSupport是一个基类,提供更底层的配置能力,但会完全禁用 Spring Boot 的自动配置;
    • WebMvcConfigurer接口则更轻量级,用于扩展而非覆盖默认配置,推荐优先使用。

自定义配置类实现 WebMvcConfigurer 接口

容器中只要有 一个 WebMvcConfigurer 组件,就能自定义底层,配置的底层行为都会生效

路径和缓存配置,手自一体模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration  // 告诉 Spring 这是一个配置类,给容器中放一个 WebMvcConfigurer 组件,就能自定义底层
public class MyConfigWebmvcConfigurer implements WebMvcConfigurer 组件,就能自定义底层 {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 保留以前的
WebMvcConfigurer.super.addResourceHandlers(registry);

// 自己加规则
registry.addResourceHandler("/static/**") // 访问static下的路径
.addResourceLocations("classpath:/ergou/", "classpath:/templates/") // 就会跳转到这两个文件夹下访问
.setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS)); // 配置缓存存活时间


}
}

或者,第二种模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration  // 告诉 Spring 这是一个配置类
public class MyConfigWebmvcConfigurer implements WebMvcConfigurer {
@Bean
public WebMvcConfigurer myWebMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 保留以前的
WebMvcConfigurer.super.addResourceHandlers(registry);

// 自己加规则
registry.addResourceHandler("/static/**") // 访问static下的路径
.addResourceLocations("classpath:/ergou/", "classpath:/templates/") // 就会跳转到这两个文件夹下访问
.setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS)); // 配置缓存存活时间


}
};
}
}
image-20250529105651424

一个比较完整的自定义配置类实现 WebMvcConfigurer 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package edu.software.ergoutree.springbootwebpart1.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

// 静态资源处理配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 保留Spring默认静态资源处理(如classpath:/static/等)
WebMvcConfigurer.super.addResourceHandlers(registry);

// 自定义静态资源规则
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/ergou/", "classpath:/templates/")
.setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS))
.resourceChain(true)
.addResolver(new org.springframework.web.servlet.resource.PathResourceResolver());

// 配置其他静态资源(如上传文件)
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:/data/uploads/");
}

// 拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 登录认证拦截器
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/api/private/**")
.excludePathPatterns("/api/private/login");

// 国际化拦截器
registry.addInterceptor(localeChangeInterceptor());
}

// 跨域资源共享配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com", "http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}

// 消息转换器配置(处理JSON、XML等格式)
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 自定义JSON转换器(设置字符集、日期格式等)
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
// 可配置ObjectMapper(如日期格式化)
converters.add(jsonConverter);

// 其他转换器...
}

// 视图解析器配置
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 配置JSP视图解析器
registry.jsp("/WEB-INF/views/", ".jsp");

// 或配置模板引擎(如Thymeleaf)
// registry.enableThymeleaf();
}

// 数据格式化配置
@Override
public void addFormatters(FormatterRegistry registry) {
// 注册自定义类型转换器
// registry.addConverter(new StringToLocalDateConverter());

// 注册自定义格式化器
// registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
}

// 异步请求配置
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(30000); // 30秒超时
// configurer.registerCallableInterceptors(new TimeoutCallableInterceptor());
}

// 内容协商配置(处理不同客户端的格式请求)
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(true)
.favorParameter(true)
.parameterName("format")
.defaultContentType(org.springframework.http.MediaType.APPLICATION_JSON)
.mediaType("json", org.springframework.http.MediaType.APPLICATION_JSON)
.mediaType("xml", org.springframework.http.MediaType.APPLICATION_XML);
}

// 国际化配置 - 区域解析器
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
resolver.setDefaultLocale(Locale.CHINA);
return resolver;
}

// 国际化配置 - 语言参数拦截器
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 通过?lang=en切换语言
return interceptor;
}

// 自定义拦截器 Bean
@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor();
}

// 示例:自定义拦截器类
private static class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 登录认证逻辑
String token = request.getHeader("Authorization");
if (token == null || !validateToken(token)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
return true;
}

private boolean validateToken(String token) {
// 实际项目中应调用认证服务
return true;
}
}
}

为什么我们容器中放一个 WebMvcConfigurer 就能配置底层行为

Spring MVC的配置机制是一个典型的”组合模式”应用,通过WebMvcConfigurer接口提供了一种灵活的方式来定制MVC行为。

其中的核心组件关系如下

1
2
3
4
5
6
7
8
9
[WebMvcAutoConfiguration]
|
|--- [WebMvcAutoConfigurationAdapter] (实现WebMvcConfigurer)
|
|--- [EnableWebMvcConfiguration] (继承DelegatingWebMvcConfiguration)
|
|--- [DelegatingWebMvcConfiguration] (继承WebMvcConfigurationSupport)
|
|--- [WebMvcConfigurerComposite] (聚合所有WebMvcConfigurer)

自动配置入口 是 WebMvcAutoConfiguration,Spring Boot 的自动配置类WebMvcAutoConfiguration是整个过程的总入口

public class WebMvcAutoConfiguration 自动配置类中,有这么两个类WebMvcAutoConfigurationAdapterEnableWebMvcConfiguration

WebMvcAutoConfigurationAdapter

有一个 WebMvcAutoConfigurationAdapter类,这个类是Spring Boot 早期版本中用于自动配置 Spring MVC 的一个适配器类,主要功能是在不覆盖自动配置的前提下,允许开发者通过继承该类来扩展或自定义 Spring MVC 的配置。所以说,自动配置入口中会有这个类来支持用户自定义自动配置的内容。

这个类中的配置最先执行(Order=0),其他自定义WebMvcConfigurer@Order注解顺序执行

1
2
3
4
5
6
7
8
9
@Configuration(
proxyBeanMethods = false
)
@Import({EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {

}

其中:

  • @Import(EnableWebMvcConfiguration.class)引入了核心配置
  • WebMvcAutoConfigurationAdapter本身也是一个WebMvcConfigurer实现

EnableWebMvcConfiguration

EnableWebMvcConfiguration这个类,继承了DelegatingWebMvcConfiguration类,这两个类都生效

这个类主要功能就是在 @EnableWebMvc 注解被启用时发挥作用,而WebMvcAutoConfiguration 是 Spring Boot 自动配置 MVC 的主类,在未启用 @EnableWebMvc 时生效

所以说,这个类是WebMvcAutoConfiguration支持全手动配置的一个重要入口类

1
2
3
4
5
@Configuration(
proxyBeanMethods = false
)
@EnableConfigurationProperties({WebProperties.class})
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {

而且还继承了DelegatingWebMvcConfiguration类,这个类是配置委托链

DelegatingWebMvcConfiguration

EnableWebMvcConfiguration继承了DelegatingWebMvcConfiguration,这是整个机制的核心,作为 @EnableWebMvc 注解的实际载体,负责收集并应用所有实现了 WebMvcConfigurer 接口的配置类。

而且DelegatingWebMvcConfiguration 还继承自 WebMvcConfigurationSupport(Spring MVC 的基础配置类),并在其基础上实现了配置的委派机制。

源码中有一段这个利用IoC和DI ,把容器中所有的WebMvcConfigurer的 Bean 注入进来,实现将开发者自定义的配置与 Spring MVC 的默认配置进行整合。

WebMvcConfigurationSupport 的基础上,DelegatingWebMvcConfiguration 将关键配置方法的实现委托给收集到的 WebMvcConfigurer

之后,WebMvcConfigurerComposite 类负责按顺序执行所有配置器的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
// 持有一个 WebMvcConfigurer 组合器,用于按顺序执行所有配置器的方法
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

/**
* 自动注入所有实现了 WebMvcConfigurer 接口的 Bean。
* required = false 表示允许容器中没有 WebMvcConfigurer Bean。
*/
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
// 将所有 WebMvcConfigurer 注册到组合器中
this.configurers.addWebMvcConfigurers(configurers);
}
}


/**
* 覆盖父类的路径匹配配置方法,委派给所有注册的 WebMvcConfigurer 处理。
* 这样,每个 WebMvcConfigurer 实现都可以参与路径匹配的定制。
*/
@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {
// 调用所有 WebMvcConfigurer 的 configurePathMatch 方法
this.configurers.configurePathMatch(configurer);

// 注意:父类 WebMvcConfigurationSupport 的默认实现会在这里被忽略,
// 完全由 WebMvcConfigurer 的实现控制配置。
}

/**
* 覆盖父类的静态资源处理器配置方法。
* 允许 WebMvcConfigurer 实现添加或修改静态资源映射规则。
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
this.configurers.addResourceHandlers(registry);
}

// 其他配置方法...也都是覆盖为主
}
  1. 自动装配所有WebMvcConfigurer:通过@Autowired注入容器中所有WebMvcConfigurer实现
  2. 委托模式:将配置工作委托给WebMvcConfigurerComposite
  3. 方法覆盖:重写父类WebMvcConfigurationSupport的所有配置方法

别人调用 DelegatingWebMvcConfiguration类的方法配置底层规则,而它调用所有的WebMvcConfigurer的配置底层方法,这个类将工作委托给组合对象

当应用中添加 @EnableWebMvc 注解时,Spring 会导入 DelegatingWebMvcConfiguration,然后 Spring 扫描容器中的所有 Bean,找出实现了 WebMvcConfigurer 接口的类,将这些配置器注入到 DelegatingWebMvcConfigurationconfigurers 字段中。

WebMvcConfigurerComposite

还有一个配置聚合器,WebMvcConfigurerComposite是实际处理多个配置器的核心类,通过WebMvcConfigurerComposite统一处理多个配置器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class WebMvcConfigurerComposite implements WebMvcConfigurer {
private final List<WebMvcConfigurer> delegates = new ArrayList<>();

public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.delegates.addAll(configurers);
}
}

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
for (WebMvcConfigurer delegate : this.delegates) {
delegate.configurePathMatch(configurer);
}
}

// 实现其他接口方法...
}
  • 收集所有WebMvcConfigurer实例
  • 遍历调用每个配置器的对应方法
  • 保证所有自定义配置都能生效

流程分析

所以说,当Spring MVC初始化时,完整的调用链如下:

  1. DispatcherServlet初始化触发MVC配置
  2. WebMvcConfigurationSupport中的配置方法被调用
  3. DelegatingWebMvcConfiguration重写的方法被执行
  4. WebMvcConfigurerComposite遍历所有WebMvcConfigurer
  5. 最终执行到开发者自定义的配置逻辑

配置生效过程也就是

  1. Spring容器初始化时发现MyWebMvcConfig
  2. DelegatingWebMvcConfiguration通过@Autowired收集到该配置器
  3. MVC初始化时调用configurePathMatch方法
  4. WebMvcConfigurerComposite遍历调用所有配置器的该方法
  5. 最终PathMatchConfigurer被配置为不使用尾部斜杠匹配

WebMvcConfigurer的源码回顾

这里是 WebMvcConfigurer 这个接口的源码,提供了配置 Spring MVC 底层的所有组件入口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// WebMvcConfigurer接口用于对Spring MVC进行自定义配置
public interface WebMvcConfigurer {

// 配置路径匹配相关策略,比如设置路径匹配的后缀策略、路径分隔符等
default void configurePathMatch(PathMatchConfigurer configurer) {
}

// 配置内容协商策略,例如根据请求头中的Accept字段决定返回的数据格式(如JSON、XML等)
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}

// 异步支持,配置异步支持相关参数,如异步请求的超时时间、任务执行器等
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}

// 配置默认Servlet处理策略,比如当Spring MVC无法处理请求时,是否转发给默认Servlet
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}

// 向FormatterRegistry中添加自定义的格式化器,用于数据类型的格式化和解析,如日期格式化等
default void addFormatters(FormatterRegistry registry) {
}

// 向InterceptorRegistry中添加自定义的拦截器,可用于在请求处理前后执行自定义逻辑,如权限校验、日志记录等
default void addInterceptors(InterceptorRegistry registry) {
}

// 向ResourceHandlerRegistry中添加自定义的资源处理器,用于处理静态资源(如CSS、JS文件)的映射路径等
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}

// 向CorsRegistry中添加跨域资源共享(CORS)的映射配置,解决跨域访问问题
default void addCorsMappings(CorsRegistry registry) {
}

// 向ViewControllerRegistry中添加视图控制器,用于直接映射请求到视图,而无需经过控制器方法处理
default void addViewControllers(ViewControllerRegistry registry) {
}

// 配置视图解析器,比如设置视图解析器的前缀、后缀,选择具体的视图解析器实现类等
default void configureViewResolvers(ViewResolverRegistry registry) {
}

// 向HandlerMethodArgumentResolver列表中添加自定义的处理器方法参数解析器,用于解析控制器方法的参数
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}

// 向HandlerMethodReturnValueHandler列表中添加自定义的处理器方法返回值处理器,用于处理控制器方法的返回值
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
}

// 配置HTTP消息转换器,如设置默认的JSON转换器、XML转换器等,决定如何将请求数据转换为对象以及将对象转换为响应数据
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}

// 扩展已有的HTTP消息转换器列表,可在已有的消息转换器基础上添加自定义的转换器
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}

// 配置处理器异常解析器,用于处理控制器方法中抛出的异常,如自定义异常处理逻辑、异常视图映射等
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}

// 扩展已有的处理器异常解析器列表,可在已有的异常解析器基础上添加自定义的异常解析器
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}

// 向ErrorResponse.Interceptor列表中添加自定义的错误响应拦截器,用于在错误响应返回给客户端之前进行处理
default void addErrorResponseInterceptors(List<ErrorResponse.Interceptor> interceptors) {
}

// 获取自定义的验证器,如果返回非null,则使用该验证器进行数据验证
@Nullable
default Validator getValidator() {
return null;
}

// 获取自定义的消息码解析器,用于解析和处理国际化消息码等相关操作
@Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
}