1. 程式人生 > 程式設計 >SpringBoot根據目錄結構自動配置Url字首方式

SpringBoot根據目錄結構自動配置Url字首方式

目錄
  • 自定義RequestMThnwkappingInfo
  • 通過介面的形式發現類

在很多其他框架中,比如的Flask、node.的KOA,Controller要想能夠響應前端的請求都需要我們主動去註冊到應用程式上。而Spring不需要我們自己去註冊,由Spring通過掃描註解的方式去主動發現

自定義RequestMappingInfo

Spring中的RequestMappingHandlerMapping專門來負責處理標註了@RequestMapping的控制器。建立一個類繼承並覆蓋其中的方法,從而實現對預設機制的修改。

覆蓋其中的getMappingForMethod方法,這個方法的返回值RequestMappingInfo就包含了請求的Url,修改RequestMappingInfo中的Url從而修改路由中的Url。

package com.lin.missyou.hack;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import .lang.reflect.Metho客棧d;
public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
    @Thnwk
Value("${missyou.api-package}") private String apiPackagePath ; //從配置檔案中獲取根包的路徑 @Override protected RequestMappingInfo getMappingForMethod(Method method,Class<?> handlerType) { RequestMappingInfo requestMappingInfo = super.getMappingForMethod(method,handlerType); if(null != requestMappingInfo){ //獲取url字首 String prefix = getPrefix(handlerType); //根據url字首生成RequestMappingInfo並與原有的RequestMappingInfo合併 RequestMappingInfo mappingInfo = RequestMappingInfo.paths(prefix).build().combine(requestMappingInfo); return mappingInfo; } return requestMappingInfo; } private String getPrefix(Class<?> handlerType){ String packageName = handlerType.getPackage().getName(); //獲取控制器所在包路徑 String dotPath = packageName.replaceAll(this.apiPackagePath,""); //將包路徑中多於的部分擷取掉 return dotPath.replace(".","/"); //將包路徑中的.替換成/ } }

通過介面的形式發現類

建立一個配置類AutoPrefixConfiguration將AutoPrefixUrlMapping加入到容器。配置類AutoPrefixConfiguration實現介面WebMvcRegistrations並覆蓋其中的getRequestMappingHandlerMapping方法

package com.lin.missyou.core.config;
import com.lin.missyou.hack.AutoPrefixUrlMapping;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new AutoPrefixUrlMapping();
    }
}

在配置檔案中指定根包

missyou.api-package = com.lin.missyou.api

SprinBoot的 發現機制 有兩種。一種是在控制器上標註特定註解,例如上一篇文章SpringBoot全域性異常處理中在GlobalExceptionAdvice 上標註@ControllerAdvice。另外一種是實現特定介面並覆蓋其中的特定方法,例如上面的AutoPrefixConfiguration。

測試一下

在這裡插入圖片描述

訪問結果,訪問路徑/v1/banner/test可以訪問到該控制器

在這裡插入圖片描述

將訪問路徑改為/banner/test就訪問不到了

在這裡插入圖片描述

將BannerController移動到sample資料夾下訪問路徑/v1/sample/banner/test可以訪問到該控制器

在這裡插入圖片描述

SpringBoot根據目錄結構自動配置Url字首方式

這個方法存在一些爭議。一方面認為根據目錄結構自動生成url雖然比較簡單,少寫了一些程式碼,但是無法通過控制器上標註的@RequestMapping中的引數直接看出url,程式碼的可讀性不是太好。

另一方面認為,這個方法大大的簡化了我們程式碼的編寫,同時更加易於維護,控制器隨意調整所在目錄都不需要去修改程式碼。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。