Spring Boot 攔截器 HandlerInterceptor的使用以及WebMvcConfigurer簡單介紹

當(dāng)我們使用Spring Boot構(gòu)建Web應(yīng)用程序時,HandlerInterceptor 是一個重要的組件,用于攔截請求的處理過程。HandlerInterceptor 接口定義了在請求處理的不同階段執(zhí)行的方法,允許我們在請求到達處理程序之前和之后執(zhí)行自定義邏輯。

HandlerInterceptor

在Spring Boot中,我們通常通過實現(xiàn)HandlerInterceptor 接口來創(chuàng)建自定義的攔截器。以下是HandlerInterceptor 接口定義的主要方法:

  1. preHandle:在請求到達處理程序之前被調(diào)用??梢杂糜趫?zhí)行一些前置處理邏輯,例如身份驗證、日志記錄等。如果此方法返回true,則請求繼續(xù)傳遞到處理程序;如果返回false,則請求處理終止。
  2. postHandle:在請求處理程序執(zhí)行之后,視圖渲染之前被調(diào)用??梢杂糜趫?zhí)行一些后置處理邏輯,例如修改模型數(shù)據(jù)、記錄執(zhí)行時間等。
  3. 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,并重寫了 preHandlepostHandleafterCompletion 方法,實現(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

AsyncHandlerInterceptorHandlerInterceptor 接口的一種擴展,專門用于處理異步請求。與同步請求不同,異步請求在處理過程中可能涉及到線程的切換,因此需要專門的攔截器來支持這種場景。

與普通的 HandlerInterceptor 相比,AsyncHandlerInterceptor 接口增加了對異步請求的支持,它定義了額外的方法來處理異步場景:

  1. preHandle:與同步請求的 preHandle 方法類似,在異步請求的開始階段被調(diào)用??梢杂糜趫?zhí)行一些前置處理邏輯。返回 true 表示請求繼續(xù)進行,返回 false 則中斷異步請求的處理。
  2. postHandle:與同步請求的 postHandle 方法類似,但是在異步請求的主處理線程完成處理之后調(diào)用。可以用于執(zhí)行一些后置處理邏輯。
  3. afterCompletion:與同步請求的 afterCompletion 方法類似,但是在整個異步請求完成之后調(diào)用??梢杂糜谇謇碣Y源、記錄最終日志等。
  4. 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 的場景:

  1. 長時間任務(wù)處理:
  • 當(dāng)應(yīng)用需要處理長時間運行的任務(wù)時,可以使用異步請求,而 AsyncHandlerInterceptor 可以用于處理異步請求的不同階段。
  • 例如,如果某個請求觸發(fā)了一個需要很長時間才能完成的任務(wù),你可以在異步處理的開始和結(jié)束階段執(zhí)行一些邏輯,例如記錄日志、通知用戶等。
  1. 非阻塞I/O操作:
  • 異步請求通常用于處理非阻塞 I/O 操作,例如讀取或?qū)懭氪罅繑?shù)據(jù)、調(diào)用外部服務(wù)等。
  • 在異步處理的開始和結(jié)束階段,AsyncHandlerInterceptor 可以用于執(zhí)行相關(guān)的邏輯,例如記錄性能指標(biāo)、處理異常情況等。
  1. 推送通知:
  • 當(dāng)需要實現(xiàn)服務(wù)器端推送通知給客戶端時,異步請求是一個常見的選擇。
  • 使用 AsyncHandlerInterceptor 可以在推送開始和結(jié)束的時候執(zhí)行邏輯,例如記錄推送日志、處理異常情況等。
  1. 資源處理和清理:
  • 異步請求在整個處理過程中可能涉及到多個線程,因此可以使用 AsyncHandlerInterceptor 在異步請求的不同階段進行資源的處理和清理。
  • 例如,可以在異步處理開始時分配某些資源,在異步請求結(jié)束時進行清理。
  1. 異步任務(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)配置:

  1. 自動配置的**WebMvcAutoConfiguration**可能失效:
    WebMvcAutoConfiguration是Spring Boot自動配置Web MVC的類,當(dāng)你使用WebMvcConfigurationSupport時,它可能不再生效,因為你自己提供了更高級別的配置。
  2. 靜態(tài)資源的默認(rèn)處理可能失效:
    Spring Boot默認(rèn)提供了靜態(tài)資源的處理,例如/static/路徑下的資源會被映射到classpath下的/static/目錄。使用WebMvcConfigurationSupport時,你可能需要手動配置靜態(tài)資源處理,因為默認(rèn)的可能會失效。
  3. 默認(rèn)的**ContentNegotiationStrategy**可能被替代:
    WebMvcConfigurationSupport中的configureContentNegotiation方法可以配置內(nèi)容協(xié)商策略,這可能會替代Spring Boot默認(rèn)的協(xié)商策略。
  4. 默認(rèn)的**MessageConverter**可能會失效:
    使用configureMessageConvertersextendMessageConverters方法可能會替代或擴展默認(rèn)的消息轉(zhuǎn)換器。如果你沒有顯式地配置自己的轉(zhuǎn)換器列表,可能會丟失Spring Boot默認(rèn)配置的一些消息轉(zhuǎn)換器。
  5. 默認(rèn)的**HandlerExceptionResolver**可能會失效:
    configureHandlerExceptionResolversextendHandlerExceptionResolvers方法可以配置異常處理器,這可能會替代或擴展默認(rèn)的異常處理器。
  6. 默認(rèn)的**ViewResolver**可能會失效:
    configureViewResolvers方法可以配置視圖解析器,這可能會覆蓋Spring Boot默認(rèn)的視圖解析器配置。

總的來說,使用WebMvcConfigurationSupport時,你需要更加謹(jǐn)慎地配置,確保你自己提供的配置不會完全覆蓋Spring Boot的默認(rèn)配置,以免造成意外的問題。通常情況下,建議在必要時使用WebMvcConfigurer接口進行輕量級的配置,而不是直接使用WebMvcConfigurationSupport。

如何選擇

WebMvcConfigurerWebMvcConfigurationSupport 都是用于配置 Spring MVC 的接口/類,但它們有不同的使用場景和適用范圍。

WebMvcConfigurer:
  1. 輕量級配置:
  • WebMvcConfigurer 接口提供了一種輕量級的方式來進行 Spring MVC 的配置。如果你只需要進行一些簡單的配置,比如添加攔截器、設(shè)置視圖解析器、配置資源處理等,那么使用 WebMvcConfigurer 更為合適。
  1. 保留默認(rèn)配置:
  • 使用 WebMvcConfigurer 時,Spring Boot 的默認(rèn)配置仍然會生效,你可以在現(xiàn)有的配置基礎(chǔ)上進行定制,而不是覆蓋所有默認(rèn)配置。
  1. 擴展特定功能:
  • 適用于只需要擴展某個特定功能而不是替代全部配置的場景。你可以選擇性地實現(xiàn) WebMvcConfigurer 接口中的方法,根據(jù)需要進行配置。
WebMvcConfigurationSupport:
  1. 深度定制:
  • WebMvcConfigurationSupport 提供了更為深度的自定義配置,你可以完全替代 Spring MVC 的默認(rèn)配置。如果你需要對 Spring MVC 進行更深層次的定制,比如替換默認(rèn)的異常處理器、配置全局消息轉(zhuǎn)換器、完全自定義路徑匹配規(guī)則等,那么可以使用 WebMvcConfigurationSupport。
  1. 覆蓋默認(rèn)配置:
  • 使用 WebMvcConfigurationSupport 時,需要注意可能會覆蓋 Spring Boot 默認(rèn)的配置,因此需要謹(jǐn)慎地配置,確保你提供的配置不會意外地影響到默認(rèn)配置。
  1. 全面替代:
  • 適用于需要全面替代 Spring MVC 配置的場景,特別是當(dāng)你需要做一些非常定制化的配置時,可能需要使用 WebMvcConfigurationSupport

選擇建議:

  • 如果只是進行一些輕量級的配置,或者是在現(xiàn)有的 Spring Boot 默認(rèn)配置基礎(chǔ)上進行定制,推薦使用 WebMvcConfigurer
  • 如果需要進行更深層次的自定義,甚至是完全替代 Spring MVC 的默認(rèn)配置,才考慮使用 WebMvcConfigurationSupport。

通常情況下,絕大多數(shù)項目可以通過實現(xiàn) WebMvcConfigurer 接口來滿足配置需求,而無需使用 WebMvcConfigurationSupport。只有在需要非常深度和全面的自定義時,才考慮使用 WebMvcConfigurationSupport。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容