Java Spring Boot 自定義注解詳解與實踐

目錄

    • 一、自定義注解的場景與優勢
      • 1.1 場景
      • 1.2 優勢
    • 二、創建自定義注解
      • 2.1 定義注解
      • 2.2 創建注解處理器
    • 三、使用自定義注解
      • 3.1 在業務方法上使用注解
      • 3.2 配置類加載注解
    • 四、總結

在 Spring Boot 中,自定義注解為我們提供了一種靈活且強大的方式來簡化開發、增強代碼的可讀性和可維護性。通過自定義注解,我們可以實現諸如統一日志記錄、性能監控、權限驗證等功能,而無需在每個業務方法中重復編寫相同的代碼。本文將深入探討如何在 Spring Boot 3.0 中創建和使用自定義注解,并提供具體的代碼示例。

一、自定義注解的場景與優勢

1.1 場景

在開發過程中,我們常常需要在多個地方實現相同的功能,例如日志記錄、性能監控、權限驗證等。如果直接在每個業務方法中編寫這些功能的代碼,會導致代碼重復和難以維護。

1.2 優勢

使用自定義注解的優勢在于:

  • 減少重復代碼 :通過注解的方式,將公共邏輯集中到一個地方,避免在多個地方重復編寫相同的代碼。
  • 增強代碼可讀性 :注解能夠清晰地表達方法的用途和行為,使代碼更具可讀性。
  • 便于維護和擴展 :當需要修改或擴展功能時,只需修改注解的實現邏輯,而無需在多個地方進行修改。

二、創建自定義注解

2.1 定義注解

使用 @interface 關鍵字定義注解,并通過 @Retention@Target 等元注解來指定注解的保留策略和適用目標。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD) // 指定注解適用的目標類型為方法
@Retention(RetentionPolicy.RUNTIME) // 指定注解的保留策略為運行時
@Documented
public @interface LogAnnotation {String module() default ""; // 模塊名稱String operation() default ""; // 操作描述
}

2.2 創建注解處理器

通過創建注解處理器(Aspect),利用 AOP(面向切面編程)來攔截帶有自定義注解的方法,并在方法執行前后添加自定義邏輯。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Component
@Order(1) // 指定切面的順序
public class LogAspect {private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);@Pointcut("@annotation(LogAnnotation)") // 定義切點,匹配使用了 LogAnnotation 的方法public void logPointcut() {}@Before("logPointcut()")public void doBefore() {logger.info("方法執行前,添加日志記錄邏輯");}
}

三、使用自定義注解

3.1 在業務方法上使用注解

在需要記錄日志的業務方法上添加自定義注解,指定模塊名稱和操作描述。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class DemoController {@GetMapping("/test")@LogAnnotation(module = "測試模塊", operation = "測試方法執行")public String test() {return "Hello, World!";}
}

3.2 配置類加載注解

確保 Spring 能夠掃描到自定義注解和注解處理器,可以在主應用類或配置類上添加 @ComponentScan 注解,指定掃描的包路徑。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = "your.package.name") // 指定掃描的包路徑
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

四、總結

在 Spring Boot 中創建和使用自定義注解,可以幫助我們實現代碼的復用、增強代碼的可讀性和可維護性。通過定義注解、創建注解處理器,并在業務方法上使用注解,可以輕松實現諸如日志記錄、性能監控、權限驗證等功能。希望本文的示例和講解能夠幫助你更好地理解和應用 Spring Boot 3.0 中的自定義注解。

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

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

相關文章

YOLOv5 環境配置指南

系統要求 Windows/Linux/MacOSNVIDIA GPU (推薦) 或 CPUPython 3.8CUDA 11.8 (如果使用 GPU) 安裝步驟 1. 安裝 Conda 如果還沒有安裝 Conda,請先從官網下載并安裝 Miniconda。 2. 創建虛擬環境 # 創建名為 yolov5 的新環境,使用 Python 3.8 conda…

標準精讀:2025 《可信數據空間 技術架構》【附全文閱讀】

《可信數據空間 技術架構》規范了可信數據空間的技術架構,明確其作為國家數據基礎設施的定位,以數字合約和使用控制技術為核心,涵蓋功能架構(含服務平臺與接入連接器的身份管理、目錄管理、數字合約管理等功能)、業務流程(登記、發現、創建空間及數據流通利用)及安全要求…

02.上帝之心算法用GPU計算提速50倍

本文介紹了上帝之心的算法及其Python實現,使用Python語言的性能分析工具測算性能瓶頸,將算法最耗時的部分重構至CUDA C語言在純GPU上運行,利用GPU核心更多并行更快的優勢顯著提高算法運算速度,實現了結果不變的情況下將耗時縮短五…

Elasticsearch的集群管理介紹

Elasticsearch 集群管理是確保分布式環境下系統穩定運行、高可用和高性能的關鍵。以下從集群架構、節點類型、故障轉移到監控優化,全面解析 Elasticsearch 集群管理的核心要點: 一、集群架構與節點類型 1. 基本概念 集群(Cluster):由一個或多個節點組成,共同存儲數據并…

高速串行接口

1.網口設計方案 上圖中給出了兩種網口設計方案,最上面是傳統設計方式,下面是利用GT作為PHY層的設計,然后FPGA中設計協議層和MAC層。 2.SRIO SRIO的本地操作和遠程操作 3.其他高速接口 srio rapid io aurora8b10b aurora64b66b pcie s…

第3節 Node.js 創建第一個應用

Node.js 非常強大,只需動手寫幾行代碼就可以構建出整個HTTP服務器。事實上,我們的Web應用以及對應的Web服務器基本上是一樣的。 在我們創建Node.js第一個"Hello, World!"應用前,讓我們先了解下Node.js應用是由哪幾部分組成的&…

ubuntu 安裝上傳的 ffmpeg_7.1.1.orig.tar.xz并使用

在 Ubuntu 上安裝并編譯上傳的 ffmpeg_7.1.1.orig.tar.xz 源碼包,請按照以下詳細步驟操作: 步驟 1:安裝編譯依賴 # 更新軟件包列表 sudo apt update# 安裝編譯工具和基礎依賴 sudo apt install -y build-essential autoconf automake cmake …

【Netty系列】核心概念

目錄 1. EventLoop 與線程模型 2. Channel(通道) 3. ChannelHandler 與 Pipeline 4. ByteBuf(數據容器) 5. Bootstrap 與 ServerBootstrap 6. Future 與 Promise 7. 其他核心概念 總結 Netty 是一個高性能、異步事件驅動的…

C# Costura.Fody 排除多個指定dll

按照網上的說在 FodyWeavers.xml 里修改 然后需要注意的是 指定多個排除項 不是加 | 是換行 一個換行 就排除一項 我測試的 <?xml version"1.0" encoding"utf-8"?> <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&quo…

C++基礎算法————廣度優先搜索(BFS)

一、引言 在計算機科學中,搜索算法是解決各種問題的關鍵工具之一。廣度優先搜索(Breadth-First Search,簡稱BFS)作為其中一種重要的搜索算法,以其獨特的搜索策略和廣泛的應用場景,在眾多領域發揮著重要作用。對于初學者來說,深入理解和掌握BFS算法是提升編程能力、解決…

關于Web安全:7. WebShell 管理與持久化后門

一、菜刀馬 菜刀馬&#xff08;ChinaZ WebShell&#xff09; 是一種與“中國菜刀&#xff08;ChinaZ&#xff09;”客戶端配合使用的 WebShell 木馬&#xff0c;廣泛應用于 Web 滲透測試中&#xff0c;主要使用 PHP/ASP/JSP 等語言編寫。 它的本質是一個一句話木馬&#xff0…

【仿生系統】qwen的仿生機器人解決方案

收到完整需求后&#xff0c;我將從系統架構設計、算法實現路徑、訓練方法三個維度為您構建完整的仿生機器人解決方案。以下是分階段實施方案&#xff1a; 一、核心系統架構設計&#xff08;模塊化可進化架構&#xff09; 1. 多模態感知引擎 - 視覺子系統&#xff1a;YOLOv8SAM…

Tomcat- AJP協議文件讀取/命令執行漏洞(幽靈貓復現)詳細步驟

一、漏洞描述 Apache Tomcat是由Apache軟件基金會屬下Jakarta項目開發的Servlet容器.默認情況下,Apache Tomcat會開啟AJP連接器,方便與其他Web服務器通過AJP協議進行交互.但Apache Tomcat在AJP協議的實現上存在漏洞,導致攻擊者可以通過發送惡意的AJP請求,可以讀取或者包含Web應…

IEEE P370:用于高達 50 GHz 互連的夾具設計和數據質量公制標準

大多數高頻儀器&#xff0c;如矢量網絡分析儀 &#xff08;VNA&#xff09; 和時域反射儀 &#xff08;TDR&#xff09;&#xff0c;都可以在同軸接口的末端進行非常好的測量。然而&#xff0c;復雜系統中使用的互連很少具有同軸接口。用于表征這些設備的夾具的設計和實施會對測…

OneForAll 使用手冊

OneForAll 使用手冊 一、概述 OneForAll 是一款功能強大的子域名收集工具&#xff0c;旨在幫助安全測試人員和網絡管理員全面發現目標域名的所有子域名&#xff0c;為后續的安全評估和漏洞測試提供基礎支持。它集成了多種子域名發現方法&#xff0c;包括搜索引擎查詢、DNS 枚…

從前端工程化角度解析 Vite 打包策略:為何選擇 Rollup 而非 esbuild。

文章目錄 前言一、esbuild 與 Rollup 的技術特性對比&#xff08;一&#xff09;esbuild&#xff1a;極速開發利器&#xff0c;功能尚待完善&#xff08;二&#xff09;Rollup&#xff1a;專業打包工具&#xff0c;功能全面強大 二、Vite 打包策略的工程化考量因素&#xff08;…

Chrome 通過FTP,HTTP 調用 Everything 瀏覽和搜索本地文件系統

【提問1】 Chrome調用本地 everything.exe, everything 好像有本地 FTP 服務器&#xff1f; 【DeepSeek R1 回答】 是的&#xff0c;Everything 確實內置了 HTTP/FTP 服務器功能&#xff0c;這提供了一種相對安全的瀏覽器與本地應用交互的方式。以下是完整的實現方案&#x…

Java八股文智能體——Agent提示詞(Prompt)

這個智能體能夠為正在學習Java八股文的同學提供切實幫助&#xff1a;不僅可以幫你優化答案表述&#xff0c;還能直接解答八股文相關問題——它會以面試者的視角&#xff0c;給出貼合求職場景的專業回答。 將以下內容發送給任何一個LLM&#xff0c;他會按照你提示詞的內容&…

Android 緩存應用凍結器(Cached Apps Freezer)

一、核心功能與原理 1. 功能概述 目標&#xff1a;通過凍結后臺緩存應用的進程&#xff0c;減少其對 CPU、內存等系統資源的消耗&#xff0c;優化設備性能與續航。適用場景&#xff1a;針對行為不當的后臺應用&#xff08;如后臺偷偷運行代碼、占用 CPU&#xff09;&#xff…

內存管理 : 06 內存換出

內存換出的重要性及與換入的關系 現在我們講第25講&#xff0c;主題是內存的換出&#xff08;swipe out&#xff09;。實際上&#xff0c;上一講我們講的是內存的換入&#xff0c;而這一節聚焦于內存的換出。 換入和換出必須合在一起工作&#xff0c;不能只有換入而沒有換出。…