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

全網(wǎng)最全SpringBoot集成swagger的詳細(xì)教程

 更新時(shí)間:2022年08月02日 11:44:34   作者:m0_67402013  
swagger是當(dāng)下比較流行的實(shí)時(shí)接口文文檔生成工具,swagger分為swagger2?和swagger3兩個(gè)常用版本,二者區(qū)別不是很大,主要對于依賴和注解進(jìn)行了優(yōu)化,swagger2需要引入2個(gè)jar包,swagger3只需要一個(gè),用起來沒有什么大的區(qū)別,本文給大家詳細(xì)介紹,感興趣的朋友一起看看吧

一. 接口文檔概述

swagger是當(dāng)下比較流行的實(shí)時(shí)接口文文檔生成工具。接口文檔是當(dāng)前前后端分離項(xiàng)目中必不可少的工具,在前后端開發(fā)之前,后端要先出接口文檔,前端根據(jù)接口文檔來進(jìn)行項(xiàng)目的開發(fā),雙方開發(fā)結(jié)束后在進(jìn)行聯(lián)調(diào)測試。

所以接口文檔其實(shí)就是開發(fā)之前雙方之間的一種約定。通常接口文檔分為離線的和實(shí)時(shí)的。離線的接口文檔工具有: word(相當(dāng)于沒說), YAPI, 小幺雞等,這種文檔需要程序員在上面編寫,也一般具備接口測試功能。通常是由開發(fā)人員先在離線接口文檔上編寫信息,然后交給前端人員參照開發(fā)。最大的弊端是當(dāng)我們的接口程序發(fā)生變動時(shí),需要回過頭來維護(hù)上面的內(nèi)容,很麻煩,是真的麻煩。

實(shí)時(shí)接口文檔就是可以根據(jù)我們的代碼來自動生成相應(yīng)的接口文檔,優(yōu)點(diǎn)就是我們的代碼發(fā)生變化時(shí),生成的接口文檔也會自動更新,無需我們關(guān)注修改,主需要按時(shí)發(fā)布即可。但是由于是根據(jù)代碼自動生成的,所以最大的弊端就是代碼侵入性強(qiáng),需要我們在項(xiàng)目代碼中集成生成接口文檔的相關(guān)代碼。實(shí)時(shí)接口文檔現(xiàn)在的方案有很多,但是swagger還是其中比較有影響力的一個(gè)。

二. SpringBoot集成swagger2

官網(wǎng)地址: swagger.io 當(dāng)然,官網(wǎng)都是英文的,看起來還是比較麻煩的。建議大家直接按照我的步驟來,還是很簡單的。

同時(shí)在說一點(diǎn): swagger分為swagger2 和swagger3兩個(gè)常用版本。二者區(qū)別不是很大,主要對于依賴和注解進(jìn)行了優(yōu)化。swagger2需要引入2個(gè)jar包,swagger3只需要一個(gè),用起來沒有什么大的區(qū)別。下面以swagger2為例。

2.1 引入依賴

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

2.2 引入配置

首先需要添加一個(gè)注解 : @EnableSwagger2。 這個(gè)注解我們可以添加到SpringBoot的啟動類上,也可以自定義一個(gè)配置類,放到上面。添加了這個(gè)注解以后,就代表我們已經(jīng)在項(xiàng)目中開啟了Swagger的功能。

我們采用第二種方式,自己定義一個(gè)配置類,正好還可以添加一個(gè)Docket配置。 所謂Docket配置,就是一組(一個(gè)項(xiàng)目或一個(gè)版本)接口文檔的配置,比如設(shè)置名稱, 聯(lián)系人等等。

我們在config文件夾下,添加一個(gè)SwaggerConfig類。

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    /**
     * 設(shè)置多個(gè):
     *
     * @Bean
     *     public Docket appApi() {
     *
     *         List<Parameter> pars = new ArrayList<>();
     *         ParameterBuilder token = new ParameterBuilder();
     *         token.name("token").description("用戶令牌").modelRef(new ModelRef("string")).parameterType("header").required(false)
     *                 .build();
     *         pars.add(token.build());
     *
     *         return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/app/.*")).build()
     *                 .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
     *                 .enable(enableSwagger)
     *                 .groupName("appApi");
     *
     *     }
     *
     *     @Bean
     *     public Docket adminApi() {
     *
     *         List<Parameter> pars = new ArrayList<>();
     *         ParameterBuilder token = new ParameterBuilder();
     *         token.name("token").description("用戶令牌").modelRef(new ModelRef("string")).parameterType("header").required(false)
     *                 .build();
     *         pars.add(token.build());
     *         return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/admin/.*")).build()
     *                 .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
     *                 .enable(enableSwagger)
     *                 .groupName("adminApi");
     *
     *     }
     *
     *
     * @return
     */

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                .apis(RequestHandlerSelectors.basePackage("com.lsqingfeng.action.swagger.controller")).paths(PathSelectors.any())
                .build().globalOperationParameters(setHeaderToken());

    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("action-swagger").description("swagger實(shí)戰(zhàn)").termsOfServiceUrl("")
                .version("1.0").build();
    }

    /**
     * @Description: 設(shè)置swagger文檔中全局參數(shù)
     * @param
     * @Date: 2020/9/11 10:15
     * @return: java.util.List<springfox.documentation.service.Parameter>
     */

    private List<Parameter> setHeaderToken() {
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder userId = new ParameterBuilder();
        userId.name("token").description("用戶TOKEN").modelRef(new ModelRef("string")).parameterType("header")
                .required(true).build();
        pars.add(userId.build());
        return pars;
    }
}

上面就是一個(gè)配置案例, 還設(shè)置了一個(gè)setToken方法,代表生成文檔的所有接口中,都要包含一個(gè)header類型的token參數(shù)。

2.3 給Controller 添加注解

我們接口文檔的直接描述主要就是在Controller這一層,比如這個(gè)接口的功能,參數(shù)的名稱,返回值的名稱等。這些值我們都需要在Controller上通過給方法上,請求參數(shù)和返回參數(shù)上添加對應(yīng)的注解,swagger才能幫我們生成相應(yīng)的接口文檔。這也就是我前面提到的對現(xiàn)有代碼的侵入性。

我們來寫一個(gè)案例。

首先先創(chuàng)建一個(gè)vo的包,里邊寫我們的請求和相應(yīng)參數(shù),使用JavaBean定義出請求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu)。注意這里要添加相應(yīng)的注解:

請求類:

package com.lsqingfeng.springboot.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @className: SwaggerReqVO
 * @description:
 * @author: sh.Liu
 * @date: 2022-03-22 19:19
 */
@Data
@ApiModel("創(chuàng)建Swagger請求參數(shù)")
public class SwaggerReqVO {

    @ApiModelProperty("id")
    private Integer id;

    @ApiModelProperty("姓名")
    private String name;

    @ApiModelProperty("性別")
    private Integer gender;
}

響應(yīng)類:

package com.lsqingfeng.springboot.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @className: SwaggerResVO
 * @description:
 * @author: sh.Liu
 * @date: 2022-03-22 19:20
 */
@Data
@ApiModel("創(chuàng)建Swagger響應(yīng)結(jié)果")
public class SwaggerResVO {

    @ApiModelProperty("id")
    private Integer id;

    @ApiModelProperty("姓名")
    private String name;

    @ApiModelProperty("性別")
    private Integer gender;

    @ApiModelProperty("啥啥")
    private String what;
}

這里分別使用了 @ApiModel注解和 @@ApiModelProperty 注解定義了實(shí)體的名稱和字段的名稱,方便生成接口文檔時(shí)展示。

再來看Controller:

package com.lsqingfeng.springboot.controller;

import com.lsqingfeng.springboot.vo.SwaggerReqVO;
import com.lsqingfeng.springboot.vo.SwaggerResVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

/**
 * @className: SwaggerController
 * @description: swagger 接口測試
 * @author: sh.Liu
 * @date: 2022-03-22 19:18
 */
@RestController
@RequestMapping("/swagger")
@Api(value = "用戶接口", tags = {"用戶接口"})
public class SwaggerController {

    @ApiOperation("新增用戶")
    @PostMapping("save")
    public String save(@RequestBody SwaggerReqVO req) {
        return "success";
    }

    @GetMapping("getById")
    @ApiOperation("根據(jù)條件查詢用戶")
    public SwaggerResVO getById(@RequestBody SwaggerResVO req) {
        return new SwaggerResVO();
    }
}

這里使用了@Api注解和 @ApiOperation注解分別標(biāo)注了接口組名和接口的名稱?,F(xiàn)在我們啟動項(xiàng)目。

發(fā)現(xiàn)報(bào)了這個(gè)錯(cuò)誤。

上網(wǎng)查詢原因說是SpringBoot2.6版本和Swagger2.9.2不兼容導(dǎo)致的。 也有人說是由于guava這個(gè)包的版本過低導(dǎo)致的。

我都分別試了一下,替換了guava的高版本依賴問題還是存在。

這個(gè)問題的主要原因確實(shí)是SpringBoot版本過高導(dǎo)致。如果你用的是SpringBoot2.5.x及之前版本是沒有問題的。

Spring Boot 2.6.X使用PathPatternMatcher匹配路徑,Swagger引用的Springfox使用的路徑匹配是基于AntPathMatcher的。

所以要想解決,添加配置,將springBoot MVC的路勁匹配模式修改一下即可。

在springBoot配置文件中添加配置:

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

如果是yml格式的配置文件:

再次啟動問題解決。

訪問地址: ip:端口號/swagger-ui.html

正常情況就可以看到我們的界面了。一會再說非正常情況。由于我們只給用戶接口添加了注解,所有用戶接口是可以直接觀察中文文檔的。而剩下的兩個(gè)接口,由于沒添加注解,所以都是以默認(rèn)的形式展示的。

點(diǎn)開接口,我們可以看到接口中的想詳細(xì)信息

點(diǎn)擊model,可以看到字段的中文描述。點(diǎn)擊 Try it out,就可以直接調(diào)試接口。同時(shí)注意接口中都讓填一個(gè)token,這就是我們之前的設(shè)置成效了。

截止到目前其實(shí)swagger的集成就已經(jīng)完畢了,主要就是根據(jù)我們的注解生成文檔,并且可以在線調(diào)用調(diào)試。開發(fā)的時(shí)候,我們只需要把Controller這一層的請求和響應(yīng),以及方法描述等內(nèi)容先開發(fā)完畢,就可以提供給前端讓他們參照開發(fā)了。

2.4 [404]問題解決

正常情況我們按照上面的步驟就可以出現(xiàn)頁面,但是有些時(shí)候可能是由于springBoot的版本過高導(dǎo)致的,我們輸入之前的地址,出現(xiàn)404的情況,這個(gè)主要是由于項(xiàng)目中無法讀取到swagger依賴包下的頁面導(dǎo)致的。如果出現(xiàn)了這個(gè)問題,我們可以添加一個(gè)配置類,讓他實(shí)現(xiàn)WebMvcConfigurer 接口,在添加一個(gè)方法:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

完整代碼如下:

package com.lsqingfeng.springboot.config;

import com.lsqingfeng.springboot.interceptor.TokenInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @className: WebMvcConfig
 * @description:webMvc配置
 * @author: sh.Liu
 * @date: 2022-01-13 09:51
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

這個(gè)時(shí)候在啟動就可以了!

2.5 替換UI

上面的整個(gè)過程已經(jīng)完成了,但是生成的接口文檔的頁面,其實(shí)很多人不太喜歡,覺得不太符合國人的使用習(xí)慣,所有又有一些大神,提供了其他的UI測試頁面。這個(gè)頁面的使用還是比較廣泛的。

修改方式:只需引入一個(gè)依賴包:

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.9.6</version>
</dependency>

然后把剛才實(shí)現(xiàn)的那個(gè)的那個(gè)方法再添加一條:

registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");

完成代碼:

package com.lsqingfeng.springboot.config;

import com.lsqingfeng.springboot.interceptor.TokenInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @className: WebMvcConfig
 * @description:webMvc配置
 * @author: sh.Liu
 * @date: 2022-01-13 09:51
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        //攔截
//        registry.addInterceptor(new TokenInterceptor())
//                .addPathPatterns("/**")
//                .excludePathPatterns("/login");
//    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");
    }
}

重新啟動項(xiàng)目: 訪問路徑發(fā)生了變化:** ip:端口號/doc.html**

頁面出現(xiàn)了。我們在看看我們的用戶接口:

這個(gè)風(fēng)格確實(shí)更加的直觀,同時(shí)也是可以直接進(jìn)行調(diào)試的。大部分的swagger都用的這個(gè)風(fēng)格的文檔。

三. SpringBoot集成swagger3

上面已經(jīng)很詳細(xì)的講解了swagger2的集成方式,而swagger3的集成方式更加的簡潔一些。

首先引入依賴:

<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-boot-starter</artifactId>
  <version>3.0.0</version>
</dependency>

然后是替換注解: swagger2使用的開啟注解是: @EnableSwagger2

而在swagger3中,這個(gè)注解要換成: @EnableOpenApi

配置類:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30) // v2 不同
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.swaggerv3.controller")) // 設(shè)置掃描路徑
                .build();
    }
}

要注意,里邊的版本類型換成了 OAS_30, 就是swagger3的意思。

OAS 是 OpenAPI Specification 的簡稱,翻譯成中文就是 OpenAPI 說明書。

同時(shí)訪問地址:原始地址,也就是沒換UI的地址: localhost:8080/swagger-ui/index.html這個(gè)要和swagger2區(qū)分開。

swagger3的原始UI風(fēng)格也發(fā)生了一些變化:

同時(shí)swagger3也是可以更換UI的。方法和swagger2一樣。

四. swaggerUI 攔截器和跨域沖突處理

如果我們的項(xiàng)目中有關(guān)于跨域的處理,同時(shí)還有攔截器,然后還要使用swagger,這種情況大家要注意了,有可能我們的攔截器會將swagger中的頁面路徑攔截掉導(dǎo)致swagger頁面出不來,當(dāng)我們在攔截器中把swagger的頁面排除掉的時(shí)候,也有可能會導(dǎo)致跨域配置的失效。

詳細(xì)的解決方案可以看我之前寫過的一篇博客: lsqingfeng.blog.csdn.net/article/det…

具體解決方案簡單提一下:

攔截器:

/**
 * 攔截器配置
 *
 * @author liuShuai
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Bean
    public TokenInterceptor tokenInterceptor() {
        return new TokenInterceptor();
    }
 
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(tokenInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/downloadExcel")
                .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
    }
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

跨域配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
/**
 * @className: CorsConfig
 * @description:
 * @author: sh.Liu
 * @date: 2020-12-02 10:16
 */
@Configuration
public class CorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}

用這兩種方式去配置,就可以讓他們和平共處了。

另: 配套項(xiàng)目代碼已托管中g(shù)itCode: gitcode.net/lsqingfeng/…

分支: feautre/MybatisPlus

所有文章也會在微信公眾號首發(fā)更新,歡迎關(guān)注:

五. 寫在最后

截止到本篇文章,關(guān)于SpringBoot的系列學(xué)習(xí)筆記已經(jīng)更新了十六篇,也基本上要和大家說再見了。感謝大家的一路支持。這十六篇文章主要面向SpringBoot的實(shí)戰(zhàn)性學(xué)習(xí)上,基本很少會介紹一些原理性的概念。也已經(jīng)集成目前大部分主流的框架和中間件。如果大家對于Spring中一些生命周期,初始化過程,類加載原理和常用注解不太了解(因?yàn)檫@一個(gè)部分很少介紹),建議大家結(jié)合我之前寫的Spring5系列教程一起學(xué)習(xí),里邊介紹了Spring IOC和AOP的核心概念。

這個(gè)系列的教程就更新到這里了,后面可能就不會在繼續(xù)更新這個(gè)系列了。下個(gè)目標(biāo),我可能準(zhǔn)備寫一個(gè)SpringCloud的系列教程,主要針對alibaba版本中的一些組件用法。但是由于最近公司比較忙,可能更新的會比較慢。希望大家多多支持。

到此這篇關(guān)于全網(wǎng)最全SpringBoot集成swagger的詳細(xì)教程的文章就介紹到這了,更多相關(guān)SpringBoot集成swagger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程——之一創(chuàng)建線程的四種方法

    Java多線程——之一創(chuàng)建線程的四種方法

    這篇文章主要介紹了Java創(chuàng)建線程方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 簡單了解SpringMVC全局異常處理常用方法

    簡單了解SpringMVC全局異常處理常用方法

    這篇文章主要介紹了簡單了解SpringMVC全局異常處理常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java之String類型的編碼方式轉(zhuǎn)換

    Java之String類型的編碼方式轉(zhuǎn)換

    這篇文章主要介紹了Java之String類型的編碼方式轉(zhuǎn)換,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring注解驅(qū)動之ApplicationListener用法解讀

    Spring注解驅(qū)動之ApplicationListener用法解讀

    這篇文章主要介紹了Spring注解驅(qū)動之ApplicationListener用法解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • java讀取excel文件的兩種方法

    java讀取excel文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了java讀取excel文件的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Spring中AOP概念與兩種動態(tài)代理模式原理詳解

    Spring中AOP概念與兩種動態(tài)代理模式原理詳解

    AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對OOP的有益補(bǔ)充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • java 整型數(shù)與Integer的緩存深入理解

    java 整型數(shù)與Integer的緩存深入理解

    這篇文章主要介紹了java 整型數(shù)與Integer的緩存深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringBoot實(shí)現(xiàn)WebSocket即時(shí)通訊的示例代碼

    SpringBoot實(shí)現(xiàn)WebSocket即時(shí)通訊的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)WebSocket即時(shí)通訊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot使用@Slf4j注解實(shí)現(xiàn)日志輸出的示例代碼

    SpringBoot使用@Slf4j注解實(shí)現(xiàn)日志輸出的示例代碼

    @Slf4j 是 Lombok 庫中的一個(gè)注解,它極大地簡化了日志記錄的代碼,通過使用這個(gè)注解,Lombok 會自動在你的類中注入一個(gè)靜態(tài)的日志對象,本文給大家介紹了SpringBoot使用@Slf4j注解實(shí)現(xiàn)日志輸出的方法,需要的朋友可以參考下
    2024-10-10
  • IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法

    IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法

    這篇文章主要介紹了IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評論

安阳市| 措勤县| 大同市| 扶风县| 高州市| 咸阳市| 贡觉县| 剑川县| 天津市| 五指山市| 神木县| 墨竹工卡县| 旌德县| 茶陵县| 忻城县| 郓城县| 云霄县| 阜宁县| 育儿| 甘孜县| 色达县| 万安县| 浮梁县| 邢台市| 田林县| 梅河口市| 莎车县| 南阳市| 乌审旗| 江陵县| 科尔| 沂源县| 静宁县| 安岳县| 浦江县| 玉门市| 五大连池市| 霍州市| 紫金县| 大同市| 浦城县|