最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring自定義注解實(shí)現(xiàn)接口版本管理

 更新時(shí)間:2023年11月23日 10:16:36   作者:chaojunma  
這篇文章主要介紹了Spring自定義注解實(shí)現(xiàn)接口版本管理,RequestMappingHandlerMapping類是與 @RequestMapping相關(guān)的,它定義映射的規(guī)則,即滿足怎樣的條件則映射到那個(gè)接口上,需要的朋友可以參考下

1.定義版本注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface ApiVersion {
    String value();
}

2.自定義HandlerMapping

public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
 
    @Override   // ①
    protected RequestCondition<ApiVesrsionCondition> getCustomTypeCondition(Class<?> handlerType) {
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
        return createCondition(apiVersion);
    }
 
    @Override  //②
    protected RequestCondition<ApiVesrsionCondition> getCustomMethodCondition(Method method) {
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        return createCondition(apiVersion);
    }
    //③  實(shí)例化RequestCondition
    private RequestCondition<ApiVesrsionCondition> createCondition(ApiVersion apiVersion) {
        return apiVersion == null ? null : new ApiVesrsionCondition(apiVersion.value());
    }
 
}

我們知道,光定義注解是沒什么用的,重要的是我們識(shí)別到注解,做相應(yīng)的事。RequestMappingHandlerMapping類是與 @RequestMapping相關(guān)的,它定義映射的規(guī)則。即滿足怎樣的條件則映射到那個(gè)接口上。

①處構(gòu)建類級(jí)的映射要求,AnnotationUtils.findAnnotation根據(jù)在類上面的注解實(shí)例化一個(gè)注解類。然后構(gòu)造RequestCondition。

②處構(gòu)建類級(jí)的映射要求,AnnotationUtils.findAnnotation根據(jù)在方法上面的注解實(shí)例化一個(gè)注解類。然后構(gòu)造RequestCondition。 AnnotationUtils.findAnnotation是用到Spring的工具類,根據(jù)標(biāo)注的注解識(shí)別注解。很方便,比通過反射的方式來找到注解要方便。

3.自定義條件匹配

public class ApiVersionCondition implements RequestCondition<ApiVersionCondition> {
 
    // Header中版本號(hào)名稱
    private final static String API_VERSION = "apiVersion";
 
    private final static String VERSION_SEPATATOR = ".";
 
    // 路徑中版本的前綴, 這里用 /v[1-9]/的形式
    private final static String VERSION_PREFIX_PATTERN = "(\\d+)(.\\d+)*";
 
    private String apiVersion;
 
    public ApiVersionCondition(String apiVersion) {
        this.apiVersion = apiVersion;
    }
 
    @Override
    public ApiVersionCondition combine(ApiVersionCondition other) {
        // 采用最后定義優(yōu)先原則,則方法上的定義覆蓋類上面的定義
        return new ApiVersionCondition(other.getApiVersion());
    }
 
    @Override
    @Nullable
    public ApiVersionCondition getMatchingCondition(HttpServletRequest request) {
        String apiVersion = request.getHeader(API_VERSION);
 
        if (StringUtils.isBlank(apiVersion) || !apiVersion.matches(VERSION_PREFIX_PATTERN)) {
            return null;
        }
 
        if (convertNumber(apiVersion) == convertNumber(this.apiVersion)) {
            return this;
        }
 
        return null;
    }
 
    @Override
    public int compareTo(ApiVersionCondition other, HttpServletRequest request) {
        // 優(yōu)先匹配最新的版本號(hào)
        return convertNumber(other.getApiVersion()) - convertNumber(this.apiVersion);
    }
 
    public String getApiVersion() {
        return apiVersion;
    }
 
 
    private int convertNumber(String version) {
        return Integer.parseInt(version.replace(VERSION_SEPATATOR, ""));
    }
}

4.自定義條件匹配

最后則是需要將我們的 HandlerMapping 注冊到 Spring MVC 容器,在這里我們借助WebMvcConfigurationSupport來手動(dòng)注冊,如下:

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
 
    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = new CustomRequestMappingHandlerMapping();
        handlerMapping.setOrder(0);
        handlerMapping.setInterceptors(getInterceptors());
        return handlerMapping;
    }
}

測試

定義幾個(gè)接口,用于區(qū)分不同的版本,如下:

    @ApiVersion("1.0.1")
    @GetMapping("/test")
    public String test1(){
        log.info("版本控制測試!");
        return "V1測試成功";
    }
 
 
    @ApiVersion("1.0.2")
    @GetMapping("/test")
    public String test2(){
        log.info("版本控制測試!");
        return "V2測試成功";
    }

啟動(dòng)服務(wù),請求localhost:8080/test, Header中攜帶版本號(hào)1.0.1, test1執(zhí)行。Header中攜帶版本號(hào)1.0.2, test2執(zhí)行。

到此這篇關(guān)于Spring自定義注解實(shí)現(xiàn)接口版本管理的文章就介紹到這了,更多相關(guān)Spring實(shí)現(xiàn)接口版本管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java中異步多線程超時(shí)導(dǎo)致的服務(wù)異常

    淺談java中異步多線程超時(shí)導(dǎo)致的服務(wù)異常

    下面小編就為大家?guī)硪黄獪\談java中異步多線程超時(shí)導(dǎo)致的服務(wù)異常。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • spring boot項(xiàng)目打包成war在tomcat運(yùn)行的全步驟

    spring boot項(xiàng)目打包成war在tomcat運(yùn)行的全步驟

    這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目打包成war在tomcat運(yùn)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換

    淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換

    這篇文章主要介紹了淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java @PostMapping和@GetMapping方法使用詳解

    Java @PostMapping和@GetMapping方法使用詳解

    這篇文章主要介紹了Java @PostMapping和@GetMapping方法使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • maven項(xiàng)目不編譯xml文件問題

    maven項(xiàng)目不編譯xml文件問題

    這篇文章主要介紹了maven項(xiàng)目不編譯xml文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java?方法的定義與調(diào)用詳解

    Java?方法的定義與調(diào)用詳解

    在java中,方法就是用來完成解決某件事情或?qū)崿F(xiàn)某個(gè)功能的辦法。方法實(shí)現(xiàn)的過程中,會(huì)包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計(jì)算數(shù)值,這篇文章我們來探究一下方法的定義與調(diào)用
    2022-04-04
  • java實(shí)現(xiàn)輸出字符串中第一個(gè)出現(xiàn)不重復(fù)的字符詳解

    java實(shí)現(xiàn)輸出字符串中第一個(gè)出現(xiàn)不重復(fù)的字符詳解

    這篇文章主要介紹了java實(shí)現(xiàn)輸出字符串中第一個(gè)出現(xiàn)不重復(fù)的字符詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 基于Java語言MD5加密Base64轉(zhuǎn)換方法

    基于Java語言MD5加密Base64轉(zhuǎn)換方法

    這篇文章主要為大家詳細(xì)介紹了基于Java語言的MD5加密Base64轉(zhuǎn)換方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java Process詳解及實(shí)例

    Java Process詳解及實(shí)例

    這篇文章主要介紹了Java Process詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java線程池復(fù)用線程的秘密你知道嗎

    Java線程池復(fù)用線程的秘密你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java線程池復(fù)用線程的秘密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望您能夠多多關(guān)注

    2022-03-03

最新評(píng)論

普安县| 合水县| 晋州市| 泰州市| 金寨县| 富宁县| 兴国县| 修文县| 武夷山市| 久治县| 博湖县| 天祝| 綦江县| 全南县| 石阡县| 呼图壁县| 六枝特区| 泌阳县| 东安县| 睢宁县| 大洼县| 平乡县| 仲巴县| 天津市| 南城县| 黄冈市| 沙田区| 瑞昌市| 漳浦县| 奉贤区| 泸溪县| 乌拉特前旗| 鄂托克前旗| 陇川县| 新绛县| 喀喇| 韶山市| 崇信县| 华坪县| 洪洞县| 扎兰屯市|