Java + Spring Boot 后端防抖應用實例

防抖工具(適用單機部署)

DebounceUtil.java

package com.weiyu.utils;import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** 防抖工具(適用單機部署)*/
@Component
public class DebounceUtil {private final Map<String, Boolean> debounceMap = new ConcurrentHashMap<>();private ScheduledExecutorService scheduler;@PostConstructpublic void init() {scheduler = Executors.newSingleThreadScheduledExecutor();}@PreDestroypublic void destroy() {if (scheduler != null) {scheduler.shutdown();}}/*** 檢查并設置防抖狀態* @param key 唯一標識* @param delay 防抖時間(毫秒)* @return true 允許操作*/public boolean checkAndSet(String key, long delay) {if (debounceMap.containsKey(key)) {// 在冷卻期內return false;}// 增加 keydebounceMap.put(key, true);// 延遲后移除 keyscheduler.schedule(() -> debounceMap.remove(key), delay, TimeUnit.MILLISECONDS);return true;}
}

手動防抖(臨時應用)

Controller 層:WarehouseController.java

......public class WarehouseController {......// 自動注入防抖工具@Autowiredprivate DebounceUtil debounceUtil;// 查詢待入庫的出庫明細數據@GetMapping("/ckd/queryDetailForRk")public Result<List<CkDetail>> queryCkDetailForRk(@RequestParam String ckNo) {log.info("【出庫】,查詢明細數據,/warehouse/ckd/queryDetailForRk,ckNo = {}", ckNo);// 防抖增加的代碼//#####################################################################// 防抖唯一標識:請求路徑 + 用戶名(賬號)String debounceKey = "/warehouse/ckd/queryDetailForRk:" + PublicUtils.getUserName();// 防抖時間:1秒long debounceTime = 1000;if (!debounceUtil.checkAndSet(debounceKey, debounceTime)) {throw new RuntimeException("操作過于頻繁,請稍后再試");}//#####################################################################List<CkDetail> ckDetailList = warehouseService.queryCkDetailForRk(ckNo);return Result.success(ckDetailList);}
}

?注解防抖(項目應用)

1、增加防抖注解 @Debounce

Debounce.java

package com.weiyu.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 防抖注解*/
@Target(ElementType.METHOD) // @Target 是元注解,指定當前注解 Debounce 可以應用的目標元素類型為方法 METHOD
@Retention(RetentionPolicy.RUNTIME) // @Retention 是元注解,指定當前注解 Debounce 的保留策略(生命周期)是 運行時仍可通過反射機制讀取 RUNTIME
public @interface Debounce {// 默認防抖時間long value() default 3000;// 自定義Key(支持SpEL)String key() default "";
}

2、增加防抖切面類 AOP?

DebounceAspect.java

package com.weiyu.aop;import com.weiyu.anno.Debounce;
import com.weiyu.utils.DebounceUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** 防抖切面類 AOP*/
@Component
@Aspect
public class DebounceAspect {@Autowiredprivate DebounceUtil debounceUtil;/*** 切面:防抖*/@Around("@annotation(debounceAnnotation)")public Object debounce(ProceedingJoinPoint joinPoint, Debounce debounceAnnotation) throws Throwable  {// 安全保護:注解為空時直接放行if (debounceAnnotation == null) {return joinPoint.proceed();}// 從注解中獲取 keyString key = debounceAnnotation.key();// 從注解中獲取防抖時間long delay = debounceAnnotation.value();// 處理空 key 情況if (key == null || key.isEmpty()) {// 生成默認 key:類名 + 方法名MethodSignature signature = (MethodSignature) joinPoint.getSignature();key = signature.getDeclaringTypeName() + "#" + signature.getName();}// 防抖if (!debounceUtil.checkAndSet(key, delay)) {throw new RuntimeException("操作過于頻繁,請稍后再試");}return joinPoint.proceed();}
}

Controller 層:WarehouseController.java

......public class WarehouseController {......// 自動注入防抖工具@Autowiredprivate DebounceUtil debounceUtil;// 查詢待入庫的出庫明細數據@GetMapping("/ckd/queryDetailForRk")@Debounce(key = "/warehouse/ckd/queryDetailForRk", value = 1000)public Result<List<CkDetail>> queryCkDetailForRk(@RequestParam String ckNo) {log.info("【出庫】,查詢明細數據,/warehouse/ckd/queryDetailForRk,ckNo = {}", ckNo);//        // 防抖增加的代碼
//        //#####################################################################
//        // 防抖唯一標識:請求路徑 + 用戶名(賬號)
//        String debounceKey = "/warehouse/ckd/queryDetailForRk:" + PublicUtils.getUserName();
//        // 防抖時間:1秒
//        long debounceTime = 1000;
//        if (!debounceUtil.checkAndSet(debounceKey, debounceTime)) {
//            throw new RuntimeException("操作過于頻繁,請稍后再試");
//        }
//        //#####################################################################List<CkDetail> ckDetailList = warehouseService.queryCkDetailForRk(ckNo);return Result.success(ckDetailList);}
}

頁面應用效果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87295.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL 快速入門

PostgreSQL介紹 PostgreSQL 是一個功能強大的開源關系型數據庫系統&#xff0c;它使用并擴展了 SQL 語言&#xff0c;并結合了許多功能&#xff0c;可以安全地存儲和擴展復雜的數據工作 PostgreSQL 因其經過驗證的架構、可靠性、數據完整性、強大的功能集、可擴展性以及軟件背…

CppCon 2016 學習:Out of memory? Business as usual.

當程序因為內存耗盡而拋出 std::bad_alloc 異常時&#xff0c;這并不意味著程序必須崩潰或停止運行。我們應該考慮“內存不足”作為一種可能正常出現的情況&#xff08;“Out of memory? Business as usual.”&#xff09;&#xff0c;并設計應用程序能優雅地處理這種異常。 具…

廟算兵棋推演AI開發初探(8-神經網絡模型接智能體進行游戲)

前言の碎碎念 由于我做的模仿學習&#xff0c;可能由于沒有完全模仿&#xff0c;可以說效果很爛……后來用強化學習優化&#xff0c;這個倒是不用自己做數據集了&#xff0c;為方便大家只搞代碼&#xff0c;這里只說這部分的經歷和方法。 實踐基礎介紹 1-動作 先介紹一個強化…

Uart_Prj02 Windows 窗口版串口_Step1

完成上位機控制臺串口后&#xff0c;接下來想用C#做一個Windows 窗口版的串口。上位機編程不是很熟練&#xff0c;每天學一點做一點。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.…

自動駕駛系統研發—從工程視角看純視覺自動駕駛的安全挑戰與應對策略

???? 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中一起航行,共同成長,探索技術的無限可能。 ?? 探索專欄:學…

PostgreSQL認證怎么選?PGCP中級認證、PGCM高級認證

上圖是2025年6月份最新的db-engines上的數據庫排名情況&#xff0c;可以看出PostgreSQL數據庫仍然呈上升趨勢&#xff0c;跟排名第三的"Microsoft SQL Server"起來越接近&#xff0c;國內亦是如此&#xff0c;PostgreSQL的熱潮依在&#xff0c;可見學習PostgreSQL數據…

Hive 3.x數據靜態脫敏與加密

引言 在大數據時代&#xff0c;數據已成為企業和組織的核心資產。作為數據處理的重要平臺&#xff0c;Hive 3.x存儲著大量敏感信息&#xff0c;如用戶個人身份、財務數據、商業機密等。如何確保這些數據在存儲和處理過程中的安全性&#xff0c;成為數據從業者關注的焦點。數據…

CppCon 2016 學習:Lightweight Object Persistence With Modern C++

你給出的這段文字是某個演講、論文或者技術文檔的概要&#xff08;Overview&#xff09;部分&#xff0c;內容主要是關于內存分配器&#xff08;allocator&#xff09;設計以及**對象持久化&#xff08;object persistence&#xff09;**的一些思路。讓我幫你逐條解析和理解&am…

IPv6中的ARP“NDP協議詳解“

一、概述 在IPv4網絡環境當中,我們想要與對端進行網絡通信時,首先需要去解析對方的MAC地址這樣我們才能封裝二層數據幀,就算訪問不同網絡時也需要解析網關的MAC,這些都是需要我們的ARP協議來進行操作完成的,但是在我們的IPv6網絡環境當中并沒有ARP協議,而是通過NDP協議來完成類…

TortoiseSVN遷移到本地git

將項目從Subversion&#xff08;SVN&#xff09;遷移到Git是許多開發團隊的需求&#xff0c;因為Git提供了更多的功能和靈活性。本文將詳細介紹如何使用TortoiseSVN將項目遷移到本地Git倉庫。 一、準備工作 安裝Git&#xff1a;確保在本地機器上安裝了Git。可以通過以下命令檢…

高性能 Web 服務器之Tengine

一、概述 Tengine 是一個由淘寶網發起的 Web 服務器項目。它基于 Nginx 然后針對大訪問量網站的需求&#xff0c;添加了很多高級功能和特性&#xff0c;從 2011 年 12 月開始&#xff0c;Tengine 正式開源。Tengine 的性能和穩定性已經100多家大型網站如淘寶網&#xff0c;天貓…

簡單實現HTML在線編輯器

我們繼續來看一下如何開發一個簡單的html在線編輯器&#xff0c;要求很簡單 能夠同時編輯html&#xff0c;css&#xff0c;js代碼&#xff0c;并且運行之后可以同時預覽效果 一&#xff1a;前置知識 在H5中設置了一個新的標簽&#xff0c;<iframe>&#xff0c; 用于在當前…

【Bluedroid】藍牙啟動之核心模塊(startProfiles )初始化與功能源碼解析

本文深入解析Android藍牙協議棧中 start_profiles 函數及其調用的核心模塊初始化邏輯,涵蓋 BNEP、PAN、A2DP、AVRC、HID Host、BTA_AR 等關鍵配置文件和應用層模塊。通過代碼分析與流程梳理,闡述各模塊如何通過全局控制塊、狀態機、回調機制實現功能初始化、連接管理及數據交…

RK3576 Android14 DMIC調制

一、背景 近期項目中有個DMIC調試的需求&#xff0c;擱置了較長時間&#xff0c;現今著手調試&#xff0c;遂作記錄。 二、開發環境 OS&#xff1a;Android14 Platform&#xff1a;RK3576 Linux Version&#xff1a;6.1.99 SDK Version&#xff1a;android-14.0-mid-rkr6 …

使用 Prometheus 監控 Spring Boot 應用

SpringBoot+Prometheus+Grafana實現監控 邏輯如圖 應用程序在生產環境中運行時,監控其運行狀況是非常必要的。通過實時了解應用程序的運行狀況,才能在問題出現之前得到警告,也可以通監控應用系統的運行狀況,優化性能,提高運行效率。 一、監控 Spring Boot 應用 下面我們…

簡易計算器 Python 實現

目錄 一、代碼逐步分析&#xff08;適合剛入門的朋友看&#xff09; 1.定義了一個名為simple_calculator的函數&#xff0c;封裝了整個計算器的邏輯。 二、深入分析代碼塊&#xff0c;用更加官方的語詞來說&#xff08;適合想要深入學習的朋友&#xff09; 主循環結構 退出…

開源編譯器介紹

文章目錄 基本構成傳統編譯器編譯器的發展歷史&#xff08;History of Compiler&#xff09;GCC 編譯過程與原理&#xff08;GCC Process and Principle&#xff09;LLVM/Clang 編譯過程與原理&#xff08;LLVM/Clang Process and Principle&#xff09;GCC與與 LLVM/Clang 的對…

C++ String知識點

當然可以&#xff01;下面我將以系統全面、通俗易懂、深入淺出的方式&#xff0c;為你講解 C 中非常核心但也容易被低估的內容 —— std::string。 &#x1f31f; C std::string 全面詳解 &#x1f4cc; 一、string 是什么&#xff1f; C 的 std::string 是 C 標準庫中封裝好…

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠 PDF、圖表、圖形和儀表板等文檔是豐富的數據源&#xff0c;當這些數據被提取和整理后&#xff0c;能夠為決策制定提供有價值的洞察。從自動化財務報表處理到改進商業智能工作流程&#xff0c;智能文檔處…

gradle的 build時kaptDebugKotlin 處理數據庫模塊

gradle的 build時輸出&#xff1a; Task :app:kaptDebugKotlin 注: Processing class HDCoinBean 注: Processing class HDCurrencyBean 注: Processing class HDSelfAddCoin 注: Processing class MN 注: Creating DefaultRealmModule <—> 80% EXECUTING [7m 56s] IDLE…