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

SpringBoot整合Retry的詳細(xì)指南

 更新時間:2024年12月02日 10:05:33   作者:給自己一個 smile  
在現(xiàn)代的分布式系統(tǒng)中,服務(wù)間的調(diào)用往往需要處理各種網(wǎng)絡(luò)異常、超時等問題,重試機制是一種常見的解決策略,本文將通過一個具體的使用場景來詳細(xì)介紹如何在 Spring Boot 應(yīng)用中集成和使用 Spring Retry 技術(shù),需要的朋友可以參考下

問題背景

在現(xiàn)代的分布式系統(tǒng)中,服務(wù)間的調(diào)用往往需要處理各種網(wǎng)絡(luò)異常、超時等問題。重試機制是一種常見的解決策略,它允許應(yīng)用程序在網(wǎng)絡(luò)故障或臨時性錯誤后自動重新嘗試失敗的操作。Spring Boot 提供了靈活的方式來集成重試機制,這可以通過使用 Spring Retry 模塊來實現(xiàn)。本文將通過一個具體的使用場景來詳細(xì)介紹如何在 Spring Boot 應(yīng)用中集成和使用 Spring Retry 技術(shù)。

場景描述

假如我們正在開發(fā)一個OMS系統(tǒng)(訂單管理系統(tǒng)),其中一個關(guān)鍵服務(wù) OrderService 負(fù)責(zé)訂單創(chuàng)建和調(diào)用WMS服務(wù)扣減庫存API 。由于網(wǎng)絡(luò)不穩(wěn)定或外部 API 可能暫時不可用,我們需要在這些情況下實現(xiàn)重試機制,以確保請求的成功率和系統(tǒng)的穩(wěn)定性。

實現(xiàn)步驟

1. 添加依賴

首先,在你的 pom.xml 文件中添加 Spring Retry 和 AOP 的依賴:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Retry -->
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>

    <!-- Spring Boot Starter AOP -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

</dependencies>

2. 創(chuàng)建配置類

創(chuàng)建一個配置類來配置重試模板:

package com.zlp.retry.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
/**
 *  全局重試配置
 */
@Configuration
public class CustomRetryConfig {

    /**
     *
     * 這段代碼定義了一個 `CustomRetryConfig` 類,其中包含一個 `retryTemplate` 方法。該方法用于創(chuàng)建并配置一個 `RetryTemplate` 對象,該對象用于處理重試邏輯。
     *
     * 1. 創(chuàng)建 `RetryTemplate` 實例**:創(chuàng)建一個 `RetryTemplate` 對象。
     * 2. 設(shè)置重試策略:使用 `SimpleRetryPolicy` 設(shè)置最大重試次數(shù)為5次。
     * 3. 設(shè)置延遲策略:使用 `ExponentialBackOffPolicy` 設(shè)置初始延遲時間為1000毫秒,每次重試間隔時間乘以2。
     * 4. 應(yīng)用策略:將重試策略和延遲策略應(yīng)用到 `RetryTemplate` 對象。
     */
    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate template = new RetryTemplate();

        // 設(shè)置重試策略
        SimpleRetryPolicy policy = new SimpleRetryPolicy();
        policy.setMaxAttempts(5);

        // 設(shè)置延遲策略
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        backOffPolicy.setInitialInterval(1000);
        backOffPolicy.setMultiplier(2.0);

        template.setRetryPolicy(policy);
        template.setBackOffPolicy(backOffPolicy);

        return template;
    }
}

3. 創(chuàng)建服務(wù)類

創(chuàng)建一個服務(wù)類 OrderService和接口實現(xiàn)類OrderServiceImpl,并在需要重試的方法上使用 @Retryable 注解:

/**
 * @Classname OrderService
 * @Date 2024/11/18 21:03
 * @Created by ZouLiPing
 */
public interface OrderService {

    /**
     * 創(chuàng)建訂單
     * @param createOrderReq
     * @return
     */
    String createOrder(CreateOrderReq createOrderReq);
}




package com.zlp.retry.service.impl;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.zlp.retry.dto.CreateOrderReq;
import com.zlp.retry.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * @Classname OrderServiceImpl
 * @Date 2024/11/18 21:06
 * @Created by ZouLiPing
 */
@Service
@Slf4j(topic = "OrderServiceImpl")
public class OrderServiceImpl implements OrderService {

    
    @Override
    @Retryable(value = {Exception.class},maxAttempts = 4, backoff = @Backoff(delay = 3000))
    public String createOrder(CreateOrderReq createOrderReq) {
        log.info("createOrder.req createOrderReq:{}", JSON.toJSONString(createOrderReq));
        try {
            log.info("createOrder.deductStock.調(diào)用時間={}", DateUtil.formatDateTime(DateUtil.date()));
            // 扣減庫存服務(wù)
            this.deductStock(createOrderReq);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return UUID.randomUUID().toString();
    }

    /**
     * 模擬扣減庫存
     */
    private void deductStock(CreateOrderReq createOrderReq) {
        throw new RuntimeException("庫存扣減失敗");
    }


    /**
     * 當(dāng)重試四次仍未能成功創(chuàng)建訂單時調(diào)用此方法進(jìn)行最終處理
     *
     * @param ex 異常對象,包含重試失敗的原因
     * @param createOrderReq 創(chuàng)建訂單的請求對象,包含訂單相關(guān)信息
     * @return 返回處理結(jié)果,此處返回"fail"表示最終失敗
     */
    @Recover
    public String recover(Exception ex, CreateOrderReq createOrderReq) {
        // 記錄重試四次后仍失敗的日志,包括異常信息和訂單請求內(nèi)容
        log.error("recover.resp.重試四次還是失敗.error:{},createOrderReq:{}",ex.getMessage(),JSON.toJSONString(createOrderReq));
        // 處理最終失敗的情況
        // 可以記錄日志,或者是投遞MQ,采用最終一致性的方式處理
        return "fail";
    }
}


4. 啟用重試功能

在主配置類或啟動類上添加 @EnableRetry 注解,以啟用重試功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;

@SpringBootApplication
@EnableRetry
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5. 驗證重試方法

@RestController
@RequiredArgsConstructor
public class RetryController {

    private final OrderService orderService;



    @GetMapping("getRetry")
    public String retry(){
        CreateOrderReq createOrderReq = new CreateOrderReq();
        createOrderReq.setOrderId(UUID.randomUUID().toString());
        createOrderReq.setProductId("SKU001");
        createOrderReq.setCount(10);
        createOrderReq.setMoney(100);
        return orderService.createOrder(createOrderReq);
    }
}

6.執(zhí)行操作說明

  1. 添加依賴:引入了 Spring Retry 和 AOP 的依賴,以便使用重試功能。
  2. 配置重試模板:創(chuàng)建了一個配置類 CustomRetryConfig,配置了重試策略,設(shè)置最大重試次數(shù)為5次。
  3. 創(chuàng)建服務(wù)類:在 OrderServiceImpl 類中,使用 @Retryable 注解標(biāo)記了 createOrder 方法,指定了當(dāng)發(fā)生 Exception 時進(jìn)行重試,最大重試次數(shù)為4次,每次重試間隔3秒。同時,使用 @Recover 注解標(biāo)記了 recover 方法,當(dāng)所有重試都失敗后,會調(diào)用這個方法
  4. 啟用重試功能:在主配置類或啟動類上添加 @EnableRetry 注解,以啟用重試功能。

Retry執(zhí)行流程

Retry整體流程圖

打印日志

從日志分析每隔3秒鐘會重試一次,直到到達(dá)設(shè)置最大重試次數(shù),會調(diào)用功<font style="color:#DF2A3F;">recover</font>方法中

7.結(jié)論

通過以上步驟,我們成功地在 Spring Boot應(yīng)用中集成了 Spring Retry 技術(shù),實現(xiàn)了服務(wù)調(diào)用的重試機制。這不僅提高了系統(tǒng)的健壯性和穩(wěn)定性,還減少了因網(wǎng)絡(luò)問題或外部服務(wù)暫時不可用導(dǎo)致的請求失敗。希望本文對你理解和應(yīng)用 Spring Boot 中的重試技術(shù)有所幫助。

Retry配置的優(yōu)先級規(guī)則

  1. 方法級別配置:如果某個配置在方法上定義了,則該方法上的配置會覆蓋類級別的配置和全局配置。
  2. 類級別配置:如果某個配置在類上定義了,并且該類的方法沒有單獨定義配置,則使用類級別的配置。
  3. 全局配置:如果沒有在方法或類上定義配置,則使用全局配置。

下面通過一個具體的例子來展示這些優(yōu)先級規(guī)則。假設(shè)我們有一個服務(wù)類 <font style="color:rgb(44, 44, 54);">MyService</font>,其中包含一些方法,并且我們在不同的層次上進(jìn)行了重試策略的配置。

示例代碼

import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
@Retryable(
    value = {RuntimeException.class},
    maxAttempts = 3,
    backoff = @Backoff(delay = 1000) // 類級別的配置
)
public class MyService {

    @Retryable(
        value = {RuntimeException.class},
        maxAttempts = 5,
        backoff = @Backoff(delay = 500) // 方法級別的配置
    )
    public void retryableMethodWithSpecificConfig() {
        System.out.println("Retrying with specific config...");
        throw new RuntimeException("Simulated exception");
    }

    @Retryable(
        value = {RuntimeException.class}
    )
    public void retryableMethodWithoutSpecificDelay() {
        System.out.println("Retrying without specific delay...");
        throw new RuntimeException("Simulated exception");
    }

    public void nonRetryableMethod() {
        System.out.println("This method does not retry.");
        throw new RuntimeException("Simulated exception");
    }
}

解釋

  1. retryableMethodWithSpecificConfig
    • 方法級別配置
      • <font style="color:rgb(44, 44, 54);">maxAttempts = 5</font>
      • <font style="color:rgb(44, 44, 54);">backoff.delay = 500</font>
    • 這些配置會覆蓋類級別的配置。
  2. retryableMethodWithoutSpecificDelay
    • 方法級別配置
      • <font style="color:rgb(44, 44, 54);">maxAttempts = 3</font> (繼承自類級別)
      • <font style="color:rgb(44, 44, 54);">backoff.delay = 1000</font> (繼承自類級別)
    • 這些配置繼承自類級別的配置。
  3. nonRetryableMethod
    • 該方法沒有使用 <font style="color:rgb(44, 44, 54);">@Retryable</font> 注解,因此不會進(jìn)行重試。

全局配置示例

為了進(jìn)一步說明全局配置的優(yōu)先級,我們可以配置一個全局的重試模板。

配置類

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

@Configuration
public class RetryConfig {

    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate template = new RetryTemplate();

        SimpleRetryPolicy policy = new SimpleRetryPolicy();
        policy.setMaxAttempts(4);
        template.setRetryPolicy(policy);

        FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
        fixedBackOffPolicy.setBackOffPeriod(750L);
        template.setBackOffPolicy(fixedBackOffPolicy);

        return template;
    }
}

使用全局配置的服務(wù)類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class AnotherService {

    @Autowired
    private RetryTemplate retryTemplate;

    @Retryable(
        value = {RuntimeException.class},
        maxAttempts = 6, // 方法級別的配置
        backoff = @Backoff(delay = 300) // 方法級別的配置
    )
    public void retryableMethodWithGlobalAndLocalConfig() {
        System.out.println("Retrying with global and local config...");
        throw new RuntimeException("Simulated exception");
    }

    @Retryable(
        value = {RuntimeException.class}
    )
    public void retryableMethodWithOnlyGlobalConfig() {
        System.out.println("Retrying with only global config...");
        throw new RuntimeException("Simulated exception");
    }
}

解釋

  1. retryableMethodWithGlobalAndLocalConfig
    • 方法級別配置
      • <font style="color:rgb(44, 44, 54);">maxAttempts = 6</font>
      • <font style="color:rgb(44, 44, 54);">backoff.delay = 300</font>
    • 這些配置會覆蓋全局配置。
  2. retryableMethodWithOnlyGlobalConfig
    • 全局配置
      • <font style="color:rgb(44, 44, 54);">maxAttempts = 4</font>
      • <font style="color:rgb(44, 44, 54);">backoff.delay = 750</font>
    • 這些配置繼承自全局配置。

總結(jié)一下,配置的優(yōu)先級從高到低依次是:

  1. 方法級別配置
  2. 類級別配置
  3. 全局配置

希望這個示例能幫助你理解不同層次配置的優(yōu)先級。

什么樣的場景不適合Retry

在使用重試機制時,確實有一些場景不適合應(yīng)用重試策略。了解這些場景有助于避免不必要的重試操作,從而提高系統(tǒng)的性能和穩(wěn)定性。以下是幾種不適合使用重試機制的常見場景:

  1. 冪等性不可保證的操作
    • 解釋:如果一個操作不是冪等的(即多次執(zhí)行會產(chǎn)生不同的結(jié)果),那么重試可能導(dǎo)致數(shù)據(jù)不一致或其他問題。
    • 示例:插入數(shù)據(jù)庫記錄的操作通常不是冪等的,因為重復(fù)插入會導(dǎo)致重復(fù)的數(shù)據(jù)。
  2. 長時間運行的操作
    • 解釋:對于耗時較長的操作,頻繁重試可能會導(dǎo)致系統(tǒng)資源被大量占用,影響其他任務(wù)的執(zhí)行。
    • 示例:批量處理大數(shù)據(jù)集、長時間計算的任務(wù)。
  3. 外部依賴不穩(wěn)定但無法恢復(fù)
    • 解釋:某些外部服務(wù)或API可能存在根本性的故障,無法通過簡單的重試解決。在這種情況下,重試只會浪費資源。
    • 示例:調(diào)用第三方支付接口,如果返回的是明確的失敗狀態(tài)碼(如賬戶余額不足),則不應(yīng)該重試。
  4. 網(wǎng)絡(luò)超時且無可用備用路徑
    • 解釋:在網(wǎng)絡(luò)請求超時時,如果沒有任何備用路徑或解決方案,重試可能仍然會失敗。
    • 示例:嘗試連接到某個特定IP地址的服務(wù),如果該地址一直不通,則重試沒有意義。
  5. 用戶交互過程中需要立即反饋的操作
    • 解釋:在用戶等待響應(yīng)的過程中,長時間的重試可能導(dǎo)致用戶體驗不佳。
    • 示例:提交表單后立即顯示成功消息,如果在此期間發(fā)生錯誤并進(jìn)行重試,用戶可能會感到困惑。
  6. 涉及敏感信息的操作
    • 解釋:對于涉及敏感信息的操作(如密碼修改、資金轉(zhuǎn)賬),重試可能會導(dǎo)致敏感信息泄露或重復(fù)操作。
    • 示例:更新用戶的銀行賬戶信息,一旦確認(rèn)操作完成,不應(yīng)再進(jìn)行重試。
  7. 事務(wù)邊界內(nèi)的操作
    • 解釋:在事務(wù)邊界內(nèi),重試可能會導(dǎo)致事務(wù)沖突或回滾,增加復(fù)雜性。
    • 示例:在一個復(fù)雜的數(shù)據(jù)庫事務(wù)中,部分操作失敗后進(jìn)行重試可能導(dǎo)致整個事務(wù)失敗。
  8. 已知的永久性錯誤
    • 解釋:如果能夠明確判斷出錯誤是永久性的(如配置錯誤、代碼bug),重試不會解決問題。
    • 示例:嘗試讀取不存在的文件,這種錯誤通常是永久性的。
  9. 高并發(fā)環(huán)境下的寫操作
    • 解釋:在高并發(fā)環(huán)境下,頻繁的重試可能會加劇數(shù)據(jù)庫負(fù)載,導(dǎo)致更多的鎖競爭和死鎖。
    • 示例:在電商網(wǎng)站的下單高峰期,對庫存的減少操作不宜頻繁重試。

示例代碼

為了更好地理解這些原則,下面是一個簡單的示例,展示了如何在Spring Boot中使用<font style="color:rgb(44, 44, 54);">@Retryable</font>注解,并根據(jù)上述原則決定哪些操作適合重試。

import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    // 適合重試的操作:冪等性強、短時間操作、可恢復(fù)的錯誤
    @Retryable(
        value = {RuntimeException.class},
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000)
    )
    public void retryableFetchData() {
        System.out.println("Fetching data...");
        // 模擬網(wǎng)絡(luò)請求或短暫的外部服務(wù)調(diào)用
        if (Math.random() > 0.5) {
            throw new RuntimeException("Simulated transient network error");
        }
    }

    // 不適合重試的操作:冪等性不可保證、長時間運行
    public void nonRetryableLongRunningTask() {
        System.out.println("Starting long-running task...");
        try {
            Thread.sleep(10000); // 模擬長時間運行的任務(wù)
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("Long-running task completed.");
    }

    // 不適合重試的操作:涉及敏感信息
    public void updateSensitiveInformation(String sensitiveData) {
        System.out.println("Updating sensitive information...");
        // 這里假設(shè)更新操作不是冪等的,也不應(yīng)該重試
        throw new RuntimeException("Simulated failure in updating sensitive information");
    }

    // 不適合重試的操作:已知的永久性錯誤
    public void fetchDataFromNonExistentResource() {
        System.out.println("Fetching data from a non-existent resource...");
        throw new RuntimeException("Permanent error: Resource not found");
    }
}

解釋

  1. retryableFetchData
    • 適用條件
      • 冪等性強:每次請求的結(jié)果相同。
      • 短時間操作:模擬網(wǎng)絡(luò)請求或短暫的外部服務(wù)調(diào)用。
      • 可恢復(fù)的錯誤:模擬暫時的網(wǎng)絡(luò)錯誤。
    • 重試策略
      • 最大重試次數(shù)為3次。
      • 每次重試間隔1秒。
  2. nonRetryableLongRunningTask
    • 不適用原因
      • 長時間運行:模擬長時間運行的任務(wù)。
      • 重試可能導(dǎo)致資源過度消耗。
  3. updateSensitiveInformation
    • 不適用原因
      • 涉及敏感信息:更新操作不是冪等的,也不應(yīng)該重試。
      • 重試可能導(dǎo)致數(shù)據(jù)不一致或其他安全問題。
  4. fetchDataFromNonExistentResource
    • 不適用原因
      • 已知的永久性錯誤:資源不存在,重試不會解決問題。

通過這些示例,你可以更好地理解哪些操作適合重試以及為什么某些操作不適合重試。

以上就是SpringBoot整合Retry的詳細(xì)指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot整合Retry的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何解決java.net.BindException:地址已在使用問題

    如何解決java.net.BindException:地址已在使用問題

    當(dāng)Zookeeper啟動報錯“java.net.BindException:地址已在使用”時,通常是因為指定的端口已被其他進(jìn)程占用,解決這個問題需要按照以下步驟操作:首先,使用命令如lsof -i:2181找到占用該端口的進(jìn)程號;其次,使用kill命令終止該進(jìn)程
    2024-09-09
  • Java實現(xiàn)HTTP請求的4種方式總結(jié)

    Java實現(xiàn)HTTP請求的4種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)HTTP請求的4種方式,在java開發(fā)中,經(jīng)常遇到需要調(diào)用第三方提供的接口服務(wù)的需求,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • JetBrains的IDEA編輯器自動配置的JDK版本下載目錄過程

    JetBrains的IDEA編輯器自動配置的JDK版本下載目錄過程

    文章說明Java安裝路徑為~/Library/Java/JavaVirtualMachines/ms-17.0.16,并分享配置經(jīng)驗,建議用戶根據(jù)實際需求調(diào)整環(huán)境變量,以確保Java版本正確運行
    2025-08-08
  • 聊聊SpringBoot整合Nacos自動刷新配置的問題

    聊聊SpringBoot整合Nacos自動刷新配置的問題

    Nacos作為SpringBoot服務(wù)的注冊中心和配置中心,本例將在配置文件中配置一個?cml.age=100?的配置項,程序中編寫一個方法讀取配置文件,并通過?Get--->/test/age?接口提供給瀏覽器訪問,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明

    Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明

    這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java深入分析Iterator迭代器與foreach循環(huán)的使用

    Java深入分析Iterator迭代器與foreach循環(huán)的使用

    這篇文章主要介紹了Java-Iterator迭代器與foreach循環(huán),主要包括Iterator迭代器接口的操作方法和foreach?循環(huán)語法解析,需要的朋友可以參考下
    2022-05-05
  • Java線程池的簡單使用方法實例教程

    Java線程池的簡單使用方法實例教程

    線程的使用在java中占有極其重要的地位,在jdk1.4極其之前的jdk版本中,關(guān)于線程池的使用是極其簡陋的,在jdk1.5之后這一情況有了很大的改,這篇文章主要給大家介紹了關(guān)于Java線程池的簡單使用方法,需要的朋友可以參考下
    2021-10-10
  • Java實現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計并輸出每個單詞出現(xiàn)次數(shù)的方法

    Java實現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計并輸出每個單詞出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了Java實現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計并輸出每個單詞出現(xiàn)次數(shù)的方法,涉及java文件I/O操作及字符串遍歷、運算實現(xiàn)統(tǒng)計功能相關(guān)技巧,需要的朋友可以參考下
    2017-07-07
  • Java SpringBoot開發(fā)小技巧詳解

    Java SpringBoot開發(fā)小技巧詳解

    這篇文章主要介紹了淺談SpringBoot項目如何讓前端開發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • maven手動上傳jar包示例及圖文步驟過程

    maven手動上傳jar包示例及圖文步驟過程

    這篇文章主要為大家介紹了maven手動上傳jar包示例及圖文步驟過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03

最新評論

遂溪县| 和林格尔县| 水富县| 梧州市| 新田县| 泰宁县| 沾益县| 嘉黎县| 吉林省| 应城市| 吴忠市| 莲花县| 大石桥市| 巢湖市| 丰宁| 辉南县| 松溪县| 崇礼县| 彰化市| 崇义县| 碌曲县| 镇沅| 东丰县| 富川| 屏山县| 昆明市| 无为县| 泸西县| 津市市| 保靖县| 德江县| 巫溪县| 祁门县| 五原县| 济源市| 香河县| 买车| 灌云县| 景德镇市| 叶城县| 晋宁县|