當(dāng)我們使用Spring Boot構(gòu)建Web應(yīng)用程序時,HandlerInterceptor 是一個重要的組件,用于攔截請求的處理過程。HandlerInterceptor 接口定義了在請求處理的不同階段執(zhí)行的方法,允許我們在請求到達處理程序之前和之后執(zhí)行自定義邏輯。
HandlerInterceptor
在Spring Boot中,我們通常通過實現(xiàn)HandlerInterceptor 接口來創(chuàng)建自定義的攔截器。以下是HandlerInterceptor 接口定義的主要方法:
-
preHandle:在請求到達處理程序之前被調(diào)用??梢杂糜趫?zhí)行一些前置處理邏輯,例如身份驗證、日志記錄等。如果此方法返回
true,則請求繼續(xù)傳遞到處理程序;如果返回false,則請求處理終止。 - postHandle:在請求處理程序執(zhí)行之后,視圖渲染之前被調(diào)用??梢杂糜趫?zhí)行一些后置處理邏輯,例如修改模型數(shù)據(jù)、記錄執(zhí)行時間等。
- afterCompletion:在整個請求完成之后被調(diào)用。通常用于清理資源、記錄最終日志等??梢栽谶@里獲取到處理程序的執(zhí)行結(jié)果和可能的異常信息。
要使用HandlerInterceptor,我們需要在配置類中注冊它。例如,在Spring Boot中,我們可以創(chuàng)建一個繼承自WebMvcConfigurerAdapter(在Spring 5中使用WebMvcConfigurer)的配置類,并重寫addInterceptors 方法。
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**");
}
}
在這個例子中,MyHandlerInterceptor 是我們自定義的攔截器類,它需要實現(xiàn)HandlerInterceptor 接口。
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在請求處理前執(zhí)行的邏輯
return true; // 返回 true 允許請求繼續(xù),返回 false 則終止請求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在請求處理后、視圖渲染前執(zhí)行的邏輯
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整個請求完成后執(zhí)行的邏輯
}
}
通過使用HandlerInterceptor,我們可以實現(xiàn)對請求處理過程的精細(xì)控制,例如添加全局的身份驗證、記錄請求日志等功能。
HandlerInterceptorAdapter
HandlerInterceptorAdapter 是 Spring 提供的一個適配器類,實現(xiàn)了 HandlerInterceptor 接口,并且提供了默認(rèn)的空實現(xiàn)。它的存在使得我們在實現(xiàn)自定義攔截器時,只需要關(guān)注我們感興趣的方法,而不需要實現(xiàn)所有方法。
具體來說,HandlerInterceptorAdapter 實現(xiàn)了 HandlerInterceptor 接口的三個方法:preHandle、postHandle、和 afterCompletion。默認(rèn)情況下,這些方法的實現(xiàn)為空,允許我們只重寫需要的方法,而不用關(guān)心其他方法。
以下是一個簡單的例子,展示了如何使用 HandlerInterceptorAdapter:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在請求處理前執(zhí)行的邏輯
return true; // 返回 true 允許請求繼續(xù),返回 false 則終止請求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在請求處理后、視圖渲染前執(zhí)行的邏輯
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整個請求完成后執(zhí)行的邏輯
}
}
在這個例子中,MyInterceptor 類繼承了 HandlerInterceptorAdapter,并重寫了 preHandle、postHandle 和 afterCompletion 方法,實現(xiàn)了自定義的攔截邏輯。
然后,我們可以將這個攔截器注冊到 Spring MVC 的配置中,就像之前提到的方式一樣:
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
使用 HandlerInterceptorAdapter 可以讓攔截器的實現(xiàn)更加簡潔,只需關(guān)注自己感興趣的方法即可。
AsyncHandlerInterceptor
AsyncHandlerInterceptor 是 HandlerInterceptor 接口的一種擴展,專門用于處理異步請求。與同步請求不同,異步請求在處理過程中可能涉及到線程的切換,因此需要專門的攔截器來支持這種場景。
與普通的 HandlerInterceptor 相比,AsyncHandlerInterceptor 接口增加了對異步請求的支持,它定義了額外的方法來處理異步場景:
-
preHandle:與同步請求的
preHandle方法類似,在異步請求的開始階段被調(diào)用??梢杂糜趫?zhí)行一些前置處理邏輯。返回true表示請求繼續(xù)進行,返回false則中斷異步請求的處理。 -
postHandle:與同步請求的
postHandle方法類似,但是在異步請求的主處理線程完成處理之后調(diào)用。可以用于執(zhí)行一些后置處理邏輯。 -
afterCompletion:與同步請求的
afterCompletion方法類似,但是在整個異步請求完成之后調(diào)用??梢杂糜谇謇碣Y源、記錄最終日志等。 - afterConcurrentHandlingStarted:在異步請求處理開始時被調(diào)用。此時,主處理線程已經(jīng)處理完請求,而異步請求的處理可能在其他線程中進行??梢杂糜趫?zhí)行一些異步處理開始時的邏輯。
要使用 AsyncHandlerInterceptor,我們可以通過實現(xiàn)該接口并將其注冊到配置中,就像使用普通的 HandlerInterceptor 一樣。以下是一個簡單的例子:
public class MyAsyncHandlerInterceptor implements AsyncHandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在異步請求開始前執(zhí)行的邏輯
return true; // 返回 true 允許請求繼續(xù),返回 false 則中斷異步請求的處理
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在異步請求的主處理線程完成處理后執(zhí)行的邏輯
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整個異步請求完成后執(zhí)行的邏輯
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在異步請求處理開始時執(zhí)行的邏輯
}
}
然后,將攔截器注冊到配置中:
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.registerCallableInterceptors(new MyAsyncHandlerInterceptor());
}
}
在這個例子中,MyAsyncHandlerInterceptor 是實現(xiàn)了 AsyncHandlerInterceptor 接口的自定義異步攔截器。
AsyncHandlerInterceptor使用場景
AsyncHandlerInterceptor 主要用于處理異步請求場景,其中異步請求是指在請求處理過程中,主處理線程可能會在處理的不同階段釋放出來,允許其他線程繼續(xù)處理請求。以下是一些適合使用 AsyncHandlerInterceptor 的場景:
- 長時間任務(wù)處理:
- 當(dāng)應(yīng)用需要處理長時間運行的任務(wù)時,可以使用異步請求,而
AsyncHandlerInterceptor可以用于處理異步請求的不同階段。 - 例如,如果某個請求觸發(fā)了一個需要很長時間才能完成的任務(wù),你可以在異步處理的開始和結(jié)束階段執(zhí)行一些邏輯,例如記錄日志、通知用戶等。
- 非阻塞I/O操作:
- 異步請求通常用于處理非阻塞 I/O 操作,例如讀取或?qū)懭氪罅繑?shù)據(jù)、調(diào)用外部服務(wù)等。
- 在異步處理的開始和結(jié)束階段,
AsyncHandlerInterceptor可以用于執(zhí)行相關(guān)的邏輯,例如記錄性能指標(biāo)、處理異常情況等。
- 推送通知:
- 當(dāng)需要實現(xiàn)服務(wù)器端推送通知給客戶端時,異步請求是一個常見的選擇。
- 使用
AsyncHandlerInterceptor可以在推送開始和結(jié)束的時候執(zhí)行邏輯,例如記錄推送日志、處理異常情況等。
- 資源處理和清理:
- 異步請求在整個處理過程中可能涉及到多個線程,因此可以使用
AsyncHandlerInterceptor在異步請求的不同階段進行資源的處理和清理。 - 例如,可以在異步處理開始時分配某些資源,在異步請求結(jié)束時進行清理。
- 異步任務(wù)執(zhí)行前后的邏輯:
- 如果應(yīng)用中使用了異步任務(wù)執(zhí)行框架(如 Spring 的
@Async),AsyncHandlerInterceptor可以在異步任務(wù)開始執(zhí)行前和執(zhí)行完成后執(zhí)行一些邏輯。 - 這可以用于記錄任務(wù)執(zhí)行時間、處理異常等。
總的來說,使用 AsyncHandlerInterceptor 的場景通常涉及到異步請求的處理,而這些請求在執(zhí)行過程中可能涉及到線程的切換和長時間運行的任務(wù)。在這些場景中,AsyncHandlerInterceptor 提供了一種機制,允許我們在異步請求的不同階段執(zhí)行自定義邏輯,以滿足特定需求。
Configurer
WebMvcConfigurer
WebMvcConfigurer 接口是 Spring MVC 提供的用于配置 Web MVC 的接口。通過實現(xiàn)這個接口,可以對 Spring MVC 進行一些自定義配置,例如添加攔截器、修改視圖解析器、配置消息轉(zhuǎn)換器等。以下是一些常見的用法:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
// 1. 添加攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
// 這里的 MyInterceptor 是你自定義的攔截器,可以在其中實現(xiàn)需要的攔截邏輯。
// 2. 添加自定義靜態(tài)資源處理
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
// 這樣配置后,訪問路徑 /static/** 將會映射到 classpath:/static/ 目錄下的資源。
// 3. 修改視圖解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 這里可以進行視圖解析器的自定義配置,例如:
// registry.jsp("/WEB-INF/views/", ".jsp");
// 表示使用 JSP 視圖解析器,視圖文件位于 /WEB-INF/views/ 目錄下,后綴為 .jsp。
}
// 4. 配置消息轉(zhuǎn)換器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 這里可以配置消息轉(zhuǎn)換器,例如添加自定義的 JSON 轉(zhuǎn)換器。
// converters.add(new MyJsonConverter());
}
// 5. 配置跨域資源共享(CORS)
@Override
public void addCorsMappings(CorsRegistry registry) {
// 配置跨域資源共享,允許 http://localhost:8080 發(fā)起的跨域請求訪問 /api/**
registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
}
// 這是一個簡單的例子,允許來自 http://localhost:8080 的請求跨域訪問 /api/** 路徑。
}
這個配置類通過實現(xiàn) WebMvcConfigurer 接口,為 Spring MVC 提供了一些自定義配置。具體來說:
-
添加攔截器: 通過
addInterceptors方法添加攔截器,可以在請求處理的各個階段執(zhí)行自定義邏輯。 -
添加自定義靜態(tài)資源處理: 使用
addResourceHandlers方法配置靜態(tài)資源的映射,使得這些資源可以通過指定的路徑訪問。 -
修改視圖解析器: 使用
configureViewResolvers方法配置視圖解析器,允許自定義視圖解析器的行為。 -
配置消息轉(zhuǎn)換器: 使用
configureMessageConverters方法配置消息轉(zhuǎn)換器,可以添加或修改默認(rèn)的消息轉(zhuǎn)換器,例如 JSON 轉(zhuǎn)換器。 -
配置跨域資源共享(CORS): 使用
addCorsMappings方法配置跨域資源共享,定義允許跨域訪問的路徑和來源。
在實際應(yīng)用中,你需要根據(jù)具體需求填充這些方法的具體實現(xiàn),以滿足項目的要求。在配置完成后,確保這個配置類被 Spring Boot 應(yīng)用程序正確地掃描到,以確保這些配置生效。
WebMvcConfigurationSupport
WebMvcConfigurationSupport 是 Spring MVC 提供的用于進行更深層次自定義配置的基類。
與 WebMvcConfigurer 不同,WebMvcConfigurationSupport 提供的配置更為底層,允許你對 Spring MVC 的默認(rèn)配置進行更徹底的改變。這里解釋一下示例中的各個重要方法:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
public class MyWebMvcConfig extends WebMvcConfigurationSupport {
// 1. 添加攔截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
// 這里的 MyInterceptor 是自定義的攔截器,你可以在其中實現(xiàn)需要的攔截邏輯。
// 2. 添加自定義靜態(tài)資源處理
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
// 這樣配置后,訪問路徑 /static/** 將會映射到 classpath:/static/ 目錄下的資源。
// 3. 修改視圖解析器
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
// 在這里可以進行視圖解析器的自定義配置,例如:
// registry.jsp("/WEB-INF/views/", ".jsp");
// 表示使用 JSP 視圖解析器,視圖文件位于 /WEB-INF/views/ 目錄下,后綴為 .jsp。
}
// 4. 配置消息轉(zhuǎn)換器
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 在這里可以配置消息轉(zhuǎn)換器,例如添加自定義的 JSON 轉(zhuǎn)換器。
// converters.add(new MyJsonConverter());
}
// 5. 配置跨域資源共享(CORS)
@Override
protected void addCorsMappings(CorsRegistry registry) {
// 配置跨域資源共享,允許 http://localhost:8080 發(fā)起的跨域請求訪問 /api/**
registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
}
// 這是一個簡單的例子,允許來自 http://localhost:8080 的請求跨域訪問 /api/** 路徑。
//------------------------- 其它方法 -----------------------------
// 配置路徑匹配
@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {
// 在這里可以設(shè)置路徑匹配的行為,例如是否在路徑末尾添加斜杠
// configurer.setUseTrailingSlashMatch(false);
}
// 配置異步請求的支持
@Override
protected void configureAsyncSupport(AsyncSupportConfigurer configurer) {
// 在這里可以設(shè)置異步請求的超時時間、線程池等
// configurer.setDefaultTimeout(30000);
}
// 配置內(nèi)容協(xié)商策略
@Override
protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 在這里可以設(shè)置默認(rèn)的內(nèi)容類型、請求參數(shù)中的內(nèi)容類型等
// configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
// 擴展消息轉(zhuǎn)換器
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 在這里可以在已有的轉(zhuǎn)換器列表上進行擴展
// converters.add(new MyAdditionalConverter());
}
// 配置默認(rèn)的 Servlet 處理
@Override
protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// 在這里可以啟用或禁用對靜態(tài)資源的默認(rèn) Servlet 處理
// configurer.enable();
}
// 添加簡單的視圖控制器
@Override
protected void addViewControllers(ViewControllerRegistry registry) {
// 在這里可以添加簡單的視圖控制器,將某個 URL 直接映射到某個視圖
// registry.addViewController("/home").setViewName("home");
}
// 擴展異常處理器
@Override
protected void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
// 在這里可以在已有的異常處理器列表上進行擴展
// exceptionResolvers.add(new MyAdditionalExceptionResolver());
}
// 配置異常處理器
@Override
protected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
// 在這里可以設(shè)置異常處理器的順序和是否開啟默認(rèn)異常處理器
// exceptionResolvers.order(1);
// exceptionResolvers.setUseDefaultExceptionHandler(false);
}
// 配置消息代碼解析器
@Override
protected void configureMessageCodesResolver(MessageCodesResolver codesResolver) {
// 在這里可以設(shè)置消息代碼的解析策略
// codesResolver.setMessageCodeFormatter(new MyMessageCodeFormatter());
}
// 配置視圖解析器
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
// 在這里可以設(shè)置視圖解析器的順序和是否開啟默認(rèn)視圖解析器
// registry.order(1);
// registry.enableContentNegotiation(new MappingJackson2JsonView());
}
// 添加自定義的參數(shù)解析器
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
// 在這里可以添加自定義的參數(shù)解析器,可以在已有的解析器列表上進行添加
// argumentResolvers.add(new MyAdditionalArgumentResolver());
}
// 添加自定義的返回值處理器
@Override
protected void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
// 在這里可以添加自定義的返回值處理器,可以在已有的處理器列表上進行添加
// returnValueHandlers.add(new MyAdditionalReturnValueHandler());
}
// .........
}
-
**addInterceptors**** 方法:** 通過這個方法,可以添加攔截器,允許在請求處理的不同階段執(zhí)行自定義邏輯。這與WebMvcConfigurer中的方法類似。 -
**addResourceHandlers**** 方法:** 這個方法用于添加自定義靜態(tài)資源處理。配置后,指定路徑的靜態(tài)資源將會映射到指定的資源位置。 -
**configureViewResolvers**** 方法:** 通過這個方法可以修改視圖解析器。在這里,你可以配置自定義的視圖解析器,定義視圖文件的存放位置和文件后綴等。 -
**configureMessageConverters**** 方法:** 這個方法用于配置消息轉(zhuǎn)換器??梢栽谶@里添加或修改默認(rèn)的消息轉(zhuǎn)換器,例如添加自定義的 JSON 轉(zhuǎn)換器。 -
**addCorsMappings**** 方法:** 通過這個方法可以配置跨域資源共享(CORS)。這個例子中允許了來自 http://localhost:8080 的請求跨域訪問 /api/** 路徑。
需要注意的是,在使用 WebMvcConfigurationSupport 時,Spring Boot 的默認(rèn)配置可能會失效,因此需要手動配置一些默認(rèn)行為。此外,雖然 WebMvcConfigurationSupport 提供更靈活的配置,但也更為底層,可能會增加配置的復(fù)雜性。因此,一般情況下推薦使用 WebMvcConfigurer 進行輕量級的配置。只有在需要更深層次的自定義時,才考慮使用 WebMvcConfigurationSupport。
可能會失效的配置
使用WebMvcConfigurationSupport時,Spring Boot的一些默認(rèn)配置可能會失效,因為WebMvcConfigurationSupport提供了更高級別的自定義配置,可能會覆蓋或替代Spring Boot的默認(rèn)配置。以下是一些可能會受影響的默認(rèn)配置:
-
自動配置的
**WebMvcAutoConfiguration**可能失效:
WebMvcAutoConfiguration是Spring Boot自動配置Web MVC的類,當(dāng)你使用WebMvcConfigurationSupport時,它可能不再生效,因為你自己提供了更高級別的配置。 -
靜態(tài)資源的默認(rèn)處理可能失效:
Spring Boot默認(rèn)提供了靜態(tài)資源的處理,例如/static/路徑下的資源會被映射到classpath下的/static/目錄。使用WebMvcConfigurationSupport時,你可能需要手動配置靜態(tài)資源處理,因為默認(rèn)的可能會失效。 -
默認(rèn)的
**ContentNegotiationStrategy**可能被替代:
WebMvcConfigurationSupport中的configureContentNegotiation方法可以配置內(nèi)容協(xié)商策略,這可能會替代Spring Boot默認(rèn)的協(xié)商策略。 -
默認(rèn)的
**MessageConverter**可能會失效:
使用configureMessageConverters或extendMessageConverters方法可能會替代或擴展默認(rèn)的消息轉(zhuǎn)換器。如果你沒有顯式地配置自己的轉(zhuǎn)換器列表,可能會丟失Spring Boot默認(rèn)配置的一些消息轉(zhuǎn)換器。 -
默認(rèn)的
**HandlerExceptionResolver**可能會失效:
configureHandlerExceptionResolvers和extendHandlerExceptionResolvers方法可以配置異常處理器,這可能會替代或擴展默認(rèn)的異常處理器。 -
默認(rèn)的
**ViewResolver**可能會失效:
configureViewResolvers方法可以配置視圖解析器,這可能會覆蓋Spring Boot默認(rèn)的視圖解析器配置。
總的來說,使用WebMvcConfigurationSupport時,你需要更加謹(jǐn)慎地配置,確保你自己提供的配置不會完全覆蓋Spring Boot的默認(rèn)配置,以免造成意外的問題。通常情況下,建議在必要時使用WebMvcConfigurer接口進行輕量級的配置,而不是直接使用WebMvcConfigurationSupport。
如何選擇
WebMvcConfigurer 和 WebMvcConfigurationSupport 都是用于配置 Spring MVC 的接口/類,但它們有不同的使用場景和適用范圍。
WebMvcConfigurer:
- 輕量級配置:
-
WebMvcConfigurer接口提供了一種輕量級的方式來進行 Spring MVC 的配置。如果你只需要進行一些簡單的配置,比如添加攔截器、設(shè)置視圖解析器、配置資源處理等,那么使用WebMvcConfigurer更為合適。
- 保留默認(rèn)配置:
- 使用
WebMvcConfigurer時,Spring Boot 的默認(rèn)配置仍然會生效,你可以在現(xiàn)有的配置基礎(chǔ)上進行定制,而不是覆蓋所有默認(rèn)配置。
- 擴展特定功能:
- 適用于只需要擴展某個特定功能而不是替代全部配置的場景。你可以選擇性地實現(xiàn)
WebMvcConfigurer接口中的方法,根據(jù)需要進行配置。
WebMvcConfigurationSupport:
- 深度定制:
-
WebMvcConfigurationSupport提供了更為深度的自定義配置,你可以完全替代 Spring MVC 的默認(rèn)配置。如果你需要對 Spring MVC 進行更深層次的定制,比如替換默認(rèn)的異常處理器、配置全局消息轉(zhuǎn)換器、完全自定義路徑匹配規(guī)則等,那么可以使用WebMvcConfigurationSupport。
- 覆蓋默認(rèn)配置:
- 使用
WebMvcConfigurationSupport時,需要注意可能會覆蓋 Spring Boot 默認(rèn)的配置,因此需要謹(jǐn)慎地配置,確保你提供的配置不會意外地影響到默認(rèn)配置。
- 全面替代:
- 適用于需要全面替代 Spring MVC 配置的場景,特別是當(dāng)你需要做一些非常定制化的配置時,可能需要使用
WebMvcConfigurationSupport。
選擇建議:
- 如果只是進行一些輕量級的配置,或者是在現(xiàn)有的 Spring Boot 默認(rèn)配置基礎(chǔ)上進行定制,推薦使用
WebMvcConfigurer。 - 如果需要進行更深層次的自定義,甚至是完全替代 Spring MVC 的默認(rèn)配置,才考慮使用
WebMvcConfigurationSupport。
通常情況下,絕大多數(shù)項目可以通過實現(xiàn) WebMvcConfigurer 接口來滿足配置需求,而無需使用 WebMvcConfigurationSupport。只有在需要非常深度和全面的自定義時,才考慮使用 WebMvcConfigurationSupport。