首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring Web MVC框架的配置类可以做的18件事

在使用 Spring Boot Web 框架做 Web 项目的时候,必须至少有一个配置类需要加上 @EnableWebMvc 注解,而且这个注解只能加一次,它的作用就是启用 Web Mvc 框架的配置。

我们通常把 @EnableWebMvc 注解加在实现 WebMvcConfigurer 接口的配置类上。

WebMvcConfigurer 接口定义了一系列方法,用于定制化 Spring MVC 的配置。通过实现这个接口,开发人员可以灵活地配置和扩展 Spring MVC 的功能,以满足特定的需求。

在实现 WebMvcConfigurer 接口的配置类中,我们除了使用@Bean自定义bean外,还能做哪些事情呢?

也有朋友说,我有这个配置类,但是继承的是 WebMvcConfigurerAdapter 抽象类。这个类也是 WebMvcConfigurer 的子类,里面的重写方法返回的都为空,而 WebMvcConfigurer 接口里的方法都是 default,不是必须重写,这个适配器抽象类也就没有什么实际价值,从Spring Web 5.0版本开始弃用。

一、WebMvcConfigurer接口源码

实现 WebMvcConfigurer 接口的配置类能做哪些事情,取决于该接口中的那些方法。

/** * WebMvc配置类 * 定义回调方法以自定义基于Java的Spring MVC配置,通过@EnableWebMvc启用 */public interface WebMvcConfigurer {

/** * 1、配置路径匹配器 */ default void configurePathMatch(PathMatchConfigurer configurer) { }

/** * 2、配置内容协商选项 */ default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { }

/** * 3、配置自定义异步请求支持 */ default void configureAsyncSupport(AsyncSupportConfigurer configurer) { }

/** * 4、配置默认Servlet处理器 */ default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { }

/** * 5、类型转换器 */ default void addFormatters(FormatterRegistry registry) { }

/** * 6、添加自定义拦截注册器 */ default void addInterceptors(InterceptorRegistry registry) { }

/** * 7、添加静态资源处理器 */ default void addResourceHandlers(ResourceHandlerRegistry registry) { }

/** * 8、配置跨域资源共享 */ default void addCorsMappings(CorsRegistry registry) { }

/** * 9、配置默认视图 */ default void addViewControllers(ViewControllerRegistry registry) { }

/** * 10、配置视图解析器 */ default void configureViewResolvers(ViewResolverRegistry registry) { }

/** * 11、添加控制器方法参数解析器 */ default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { }

/** * 12、添加控制器自定义返回值处理器 */ default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { }

/** * 13、配置消息转换器 */ default void configureMessageConverters(List<HttpMessageConverter<?>> converters) { }

/** * 14、扩展消息转换器 */ default void extendMessageConverters(List<HttpMessageConverter<?>> converters) { }

/** * 15、配置处理异常的解析器 */ default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { }

/** * 16、扩展处理异常的解析器 */ default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { }

/** * 17、获取自定义Validator */ @Nullable default Validator getValidator() { return null; }

/** * 18、获取自定义消息编码解析器 */ @Nullable default MessageCodesResolver getMessageCodesResolver() { return null; }

}

WebMvcConfigurer 接口中共有18个方法,可以帮助我们做18种事情。

二、18种用法整理

按照使用频率进行降序排序。

1、静态资源处理(ResourceHandlerRegistry)

通过addResourceHandlers()方法配置静态资源的处理器,使得可以访问项目中的静态资源文件,如图片、样式表和脚本等。

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") // 映射的URL路径 .addResourceLocations("classpath:/static/"); // 静态资源所在的目录 }}

在这个示例中,我们指定了映射的URL路径为/static/**,这意味着所有以/static/开头的URL请求将会被映射到类路径下的/static/目录中。

这样,当浏览器请求/static/css/style.css时,Spring MVC就会去查找类路径下的/static/css/style.css文件并返回给浏览器。

2、配置CORS

通过addCorsMappings()方法配置跨域请求的策略,允许或限制特定域名的请求。

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 映射所有路径 .allowedOrigins("http://example.com") // 允许的源,可以是具体的域名或"*"表示所有域名 .allowedMethods("GET", "POST") // 允许的HTTP方法 .allowedHeaders("header1", "header2") // 允许的请求头 .allowCredentials(true) // 是否支持用户凭证(如cookies) .maxAge(3600); // 预检请求的有效期,单位秒 }}

在这个示例中配置了跨域资源共享(CORS)的策略,允许了来自http://example.com的跨域请求,允许使用GET和POST方法,允许的请求头包括header1和header2,支持用户凭证,预检请求的有效期为3600秒。

3、配置自定义注册拦截器(Interceptor)

通过addInterceptors()方法注册拦截器,可以在请求处理的不同阶段执行预处理和后处理操作。

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addInterceptors(InterceptorRegistry registry) { // 注册自定义拦截器,指定拦截路径和排除路径 registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**"); } }

// 自定义拦截器类public class CustomInterceptor implements HandlerInterceptor { // 在请求处理之前进行调用(Controller方法调用之前) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 进行拦截器的业务逻辑处理 return true; // 返回true表示放行,返回false表示拦截 }

// 在请求处理之后调用,但是在视图被渲染之前(Controller方法调用之后) @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 拦截器的后处理逻辑 }

// 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于资源清理工作) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求结束后的清理工作 }}

在这个示例中,我们创建了一个名为CustomInterceptor的自定义拦截器,并在addInterceptors方法中将其注册到所有路径("/**")上。

在CustomInterceptor中,我们可以根据需要实现HandlerInterceptor接口中的方法,在请求处理的不同阶段进行相应的处理。

4、配置默认视图(ViewControllerRegistry )

通过addViewControllers方法实现简单自动化控制器,预先配置了响应状态码和/或要渲染响应主体的视图。

import org.springframework.context.annotation.Configuration;import org.springframework.http.HttpStatus;import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addViewControllers(ViewControllerRegistry registry) { // 配置默认主页 registry.addViewController("/").setViewName("index"); // 配置简单的重定向 registry.addRedirectViewController("/old-url", "/new-url"); // 配置404页面 registry.addViewController("/not-found").setViewName("404"); registry.addStatusController("/not-found", HttpStatus.NOT_FOUND); // 配置204响应 registry.addStatusController("/no-content", HttpStatus.NO_CONTENT); }}

在这个示例中,我们做了以下配置:

将根URL("/")映射到名为"index"的视图,这样当用户访问根URL时会显示主页。

将"/old-url"重定向到"/new-url",实现了简单的URL重定向。

配置了一个404页面,当用户访问"/not-found"时显示名为"404"的视图,并返回404状态码。

配置了一个204响应,当用户访问"/no-content"时返回204状态码,没有具体的响应内容。

这些配置都不需要编写额外的Controller类,Spring MVC会自动处理这些简单的映射和响应状态。

在没有自定义控制器逻辑的情况下很有用——例如渲染主页、执行简单的站点URL重定向、返回具有HTML内容的404状态、返回没有内容的204状态等。

5、 配置视图解析器(ViewResolver)

通过configureViewResolvers()方法配置视图解析器,用于将逻辑视图名称解析为实际视图对象。

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/", ".jsp"); // 配置JSP视图解析器,指定JSP文件位置和后缀 }}

在这个示例中,指定了JSP视图解析器,并且定义了JSP文件存放的目录(/WEB-INF/views/)以及文件的后缀(.jsp)。

当控制器返回一个String的视图名称时,Spring MVC就会根据这个配置找到对应的JSP文件并进行渲染。

6、配置路径匹配器(Path Matcher)

通过configurePathMatch()方法配置路径匹配规则,包括是否使用前缀、后缀模式匹配等。

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer .setUseSuffixPatternMatch(true) // 启用后缀模式匹配 .setUseTrailingSlashMatch(false); // 禁用尾部斜杠匹配 // 给控制器请求路径增加前缀 // configurer.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController.class)); }}

在这个示例中,我们设置了启用后缀模式匹配,并禁用了尾部斜杠匹配。

此方法用处多多,可以帮助配置尾部斜杠匹配、后缀注册、路径匹配器和路径助手。配置的路径匹配器在以下情况下共享:请求映射、视图控制器映射、资源映射。

7、配置内容协商选项(Content Negotiation Manager)

通过configureContentNegotiation()方法配置内容协商选项,实现根据请求头中的Accept字段来选择返回不同格式的内容。

import org.springframework.context.annotation.Configuration;import org.springframework.http.MediaType;import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer .favorPathExtension(true) // 优先使用路径扩展名进行内容协商 .mediaType("json", MediaType.APPLICATION_JSON) // 将.json扩展名映射到JSON .mediaType("xml", MediaType.APPLICATION_XML); // 将.xml扩展名映射到XML

// 实现根据请求头中的Accept字段来选择返回不同的内容类型(如JSON或XML)。// configurer // .defaultContentType(MediaType.APPLICATION_JSON) // 默认内容类型为JSON // .parameterName("format") // 通过参数名来进行内容协商 // .favorParameter(true) // 优先使用参数名进行内容协商 // .ignoreAcceptHeader(false); // 不忽略Accept请求头字段 }}

在这个示例中,设置了优先使用路径扩展名进行内容协商,并将.json扩展名映射到 JSON 格式,将.xml扩展名映射到 XML 格式。

在被注释的示例中,通过 configureContentNegotiation() 方法配置了内容协商策略。设置了默认的内容类型为 JSON,并指定了参数名为 format,以及将参数名优先于请求头中的 Accept 字段进行内容协商。

8、配置异步请求(Async Support Configurer)

通过configureAsyncSupport()方法配置异步请求支持。

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { configurer.setDefaultTimeout(30000); // 设置默认的异步请求超时时间为30秒 configurer.setTaskExecutor(myTaskExecutor()); // 设置自定义的任务执行器 } // 自定义线程池 private AsyncTaskExecutor myTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 设置核心线程池大小为5 executor.setMaxPoolSize(10); // 设置最大线程池大小为10 executor.setQueueCapacity(25); // 设置队列容量为25 executor.setThreadNamePrefix("MyAsyncThread-"); // 设置线程名前缀 executor.initialize(); return executor; }}

9、配置默认的Servlet处理器(Default Servlet Handler Configurer)

通过configureDefaultServletHandling()方法启用默认的Servlet处理器

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); // 启用默认的Servlet处理 }}

在这个示例中,配置处理未处理请求的处理程序,将其转发到Servlet容器的“默认”Servlet。

一个常见的用例是当DispatcherServlet映射到“/”时,覆盖了Servlet容器对静态资源的默认处理。

10、类型转换器(Converters 和 Formatters)

通过addFormatters()方法添加Converters和Formatters的实现类。

import org.springframework.context.annotation.Configuration;import org.springframework.format.FormatterRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new DateFormatter()); // registry.addConverter(new MyConverter()); } }// Formatter 的实现类public class DateFormatter implements Formatter<Date> {

private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);

@Override public Date parse(String text, Locale locale) throws ParseException { return dateFormat.parse(text); }

@Override public String print(Date object, Locale locale) { return dateFormat.format(object); }}

在这个示例中,我们创建了一个 DateFormatter 类来处理 Date 类型的数据。它实现了 Formatter<Date> 接口,并提供了 parse 和 print 方法来解析和格式化日期。

在 addFormatters 方法中,我们将这个自定义的日期格式化器注册到了 FormatterRegistry 中。这样,在应用程序中使用日期时,Spring 就会使用我们定义的格式进行解析和格式化。

11、控制器方法参数解析器(HandlerMethodArgumentResolver)

通过 addArgumentResolvers() 方法实现,这个方法看完示例感觉多此一举,可能会在某种特殊情况使用吧。

假设有一个用户管理系统,其中有一个UserController控制器类,其中的一个方法需要接收一个自定义的UserFilter对象作为参数,用于筛选用户列表。我们可以通过自定义参数解析器来实现这个功能。

首先,我们定义一个UserFilter类。

public class UserFilter { private String username; private int age; // Getters and setters}

然后,我们创建一个UserFilterResolver类来实现自定义参数解析器。

import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;

public class UserFilterResolver implements HandlerMethodArgumentResolver {

@Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(UserFilter.class); }

@Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { UserFilter userFilter = new UserFilter(); userFilter.setUsername(webRequest.getParameter("username")); userFilter.setAge(Integer.parseInt(webRequest.getParameter("age"))); return userFilter; }}

接下来,我们在WebMvcConfig类中注册这个自定义参数解析器。

import org.springframework.context.annotation.Configuration;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new UserFilterResolver()); }}

最后,我们在UserController中编写一个需要接收UserFilter参数的方法。

import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;

@RestControllerpublic class UserController {

@GetMapping("/users") public String getUsers(UserFilter userFilter) { // 根据传入的用户筛选条件,返回符合条件的用户列表 return "Filtered users: " + userFilter.getUsername() + ", " + userFilter.getAge(); }}

现在,当我们发送一个GET请求到/users路径,并传递username和age参数时,Spring MVC会自动使用我们注册的自定义参数解析器UserFilterResolver来解析这些参数,并将它们封装成一个UserFilter对象传递给getUsers方法。

12、控制器返回值维护(HandlerMethodReturnValueHandler)

通过addReturnValueHandlers方法实现。

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { handlers.add(new CustomReturnValueHandler()); }}

public class CustomReturnValueHandler implements HandlerMethodReturnValueHandler {

@Override public boolean supportsReturnType(MethodParameter returnType) { return returnType.getMethod().getReturnType().equals(List.class); }

@Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if (returnValue != null && returnValue instanceof List) { List<String> dataList = (List<String>) returnValue; // Modify the return value before sending it to the client dataList.add("Additional Data"); } mavContainer.setRequestHandled(true); }}

在这个示例中,当getData方法返回一个列表时,Spring MVC会使用我们注册的处理器来修改返回的列表,然后再将其发送给客户端。

自定义返回值处理器的主要作用是在控制器方法返回结果之前对返回值进行修改或处理。这样可以在不修改控制器方法逻辑的情况下,对返回值进行统一的处理,例如添加额外的数据、加密数据等。

13、配置消息转换器(Message Converter)

通过configureMessageConverters()方法配置消息转换器,实现请求和响应的数据格式转换,比如将Java对象转换为JSON或XML格式。

import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 添加 JSON 消息转换器 converters.add(new MappingJackson2HttpMessageConverter()); // 还可以添加其他类型的消息转换器,如 XML 消息转换器 // converters.add(new MappingJackson2XmlHttpMessageConverter()); }}

在这个示例中,添加了一个用于将 Java 对象转换为 JSON 格式的 MappingJackson2HttpMessageConverter 消息转换器。还可以根据需要添加其他类型的消息转换器,比如将 Java 对象转换为 XML 格式的转换器。

14、扩展消息转换器(HttpMessageConverter)

通过 extendMessageConverters 方法进行扩展,这个同13没什么区别。

15、配置处理异常的解析器(HandlerExceptionResolver)

通过 configureHandlerExceptionResolvers 方法实现。

@RestController@RequestMapping("/api")public class ApiController {

@GetMapping("/error") public String throwError() { throw new RuntimeException("Something went wrong!"); }}

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { // Add custom exception resolver resolvers.add(new CustomHandlerExceptionResolver()); }}

public class CustomHandlerExceptionResolver implements HandlerExceptionResolver {

@Override public ModelAndView resolveException(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error"); modelAndView.addObject("message", "Custom error message: " + ex.getMessage()); return modelAndView; }}

在这个示例中,我们添加了一个自定义的异常解析器CustomHandlerExceptionResolver到resolvers列表中。这个自定义异常解析器实现了HandlerExceptionResolver接口,重写了resolveException方法,在该方法中我们可以自定义处理异常的逻辑。

这样,当控制器方法中抛出异常时,Spring MVC会使用我们指定的异常解析器来处理异常,并返回自定义的错误页面或错误消息,从而实现了对异常的定制化处理。

16、扩展处理异常的解析器

通过 extendHandlerExceptionResolvers 方法实现,这个同15没什么区别。

17、获取自定义验证器

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer {

@Override public Validator getValidator() { // 自定义验证类 return new CustomValidator(); }}

public class CustomValidator implements Validator {

@Override public boolean supports(Class<?> clazz) { // 用于检查验证器是否支持给定类的逻辑 return false; }

@Override public void validate(Object target, org.springframework.validation.Errors errors) { // 自定义验证逻辑 }}

在getValidator方法中,我们返回了一个自定义的验证器CustomValidator实例。这个自定义验证器实现了Validator接口,其中包含了支持的类判断逻辑和自定义的验证逻辑。

通过重写getValidator方法,我们可以提供自定义的验证器实现,用于对控制器方法中的数据进行验证,从而保证数据的合法性和完整性。

18、获取消息编码解析器

@RestController@RequestMapping("/api")public static class ApiController {

@GetMapping("/data") public String getData() { // Just a dummy endpoint return "Some data"; }}

@Configuration@EnableWebMvcpublic static class WebMvcConfig implements WebMvcConfigurer {

@Override public MessageCodesResolver getMessageCodesResolver() { // Return custom message codes resolver return new CustomMessageCodesResolver(); }}

public static class CustomMessageCodesResolver extends DefaultMessageCodesResolver {

@Override public String[] resolveMessageCodes(String errorCode, String objectName) { // Custom message codes resolution logic return super.resolveMessageCodes(errorCode, objectName); }}

在上面的示例中,我们返回了一个自定义的消息代码解析器CustomMessageCodesResolver实例。这个自定义消息代码解析器继承自DefaultMessageCodesResolver,可以根据自定义的逻辑解析错误码和对象名称,并返回相应的消息代码数组。

通过重写getMessageCodesResolver方法,我们可以提供自定义的消息代码解析器,用于根据特定的错误码和对象名称解析相应的消息代码,从而实现对错误消息的定制化处理。

三、最后总结

WebMvcConfigurer 提供18个方法,常用的方法有:配置视图解析器、静态资源处理、消息转换器、拦截器等。接口中的方法都用default修饰,因此我们可以只重写需要的方法,而不必实现所有方法。

大部分用不到的方法先了解一下,知道它有这个方法就可以了,可以在需要的时候再深入研究。此外,可以有多个类实现 WebMvcConfigurer 接口,它们的配置会被合并起来,共同作用于 Spring MVC 的配置。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O4to17SqOPAahFZSXF7LyYKA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券