【Annotation】SpringBoot自定義注解

1. 自定義注釋是基于SpringAOP實現的

Spring AOP(Aspect-Oriented Programming,面向切面編程)是Spring框架中的一個強大功能模塊,它實現了AOP編程模型,允許開發者將橫切關注點(如日志記錄、事務管理、安全性檢查、性能監控等)從業務邏輯中分離出來,以提高代碼的模塊化程度、可維護性和可重用性。

核心概念

  • 切面(Aspect):切面是跨越多個對象的關注點模塊化方式的實現。它封裝了橫切關注點,比如事務管理就是企業級應用中的一個關注點,它可能會影響到多個對象的操作。
  • 連接點(Joinpoint):在程序執行過程中的某個特定點,如方法調用或異常拋出等,其中可以插入切面代碼。Spring AOP只支持方法執行作為連接點。
    切入點(Pointcut):切入點定義了切面在何處應用,即匹配連接點的一組規則。通過表達式來指定哪些方法或類應該被切面影響。
  • 通知(Advice):在切面識別到特定的連接點時執行的動作。有五種類型的通知:
    • 前置通知(Before):在目標方法被調用之前執行。
    • 后置通知(After):在目標方法執行完畢后(無論是否發生異常)執行。
    • 返回通知(AfterReturning):在目標方法成功執行后執行。
    • 異常通知(AfterThrowing):在目標方法拋出異常后執行。
    • 環繞通知(Around):圍繞著目標方法執行,在方法調用前后都可以進行自定義操作,還可以決定是否繼續執行目標方法。
  • 織入(Weaving):將切面代碼插入到應用程序代碼中的過程。Spring AOP支持兩種織入方式:編譯期織入和運行時織入,Spring采用的是運行時織入,即在應用運行時通過動態代理來實現。
    實現方式

Spring AOP提供了兩種代理方式來實現切面邏輯的織入:

  • JDK動態代理:當目標對象實現了至少一個接口時,Spring會使用JDK動態代理技術創建代理對象。這種方式的代理對象需要與目標對象實現相同的接口。
  • CGLIB代理:如果目標對象沒有實現接口,Spring會使用CGLIB庫來創建目標對象的子類代理。這種方式對于沒有接口的類同樣適用,但要求目標類不能是final的,且必須有默認構造函數。

使用Spring AOP

在Spring中使用AOP,通常涉及定義切面類(使用@Aspect注解標記)、定義切入點(使用@Pointcut注解)、以及在切點上應用通知(使用如@Before、@After等注解)。通過這些配置,Spring框架會在運行時自動創建代理對象,將切面邏輯編織進目標對象的方法調用流程中,從而實現非侵入式的橫切關注點管理。

2. 使用自定義注釋

步驟1: 定義自定義注解

首先,我們定義一個自定義注解@LogExecutionTime,用于標記需要記錄執行時間的方法。

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)
public @interface LogExecutionTime {
}

步驟2: 創建切面類

接著,我們創建一個切面類LoggingAspect,使用@Aspect注解標記,并在其中定義切點和通知邏輯。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);@Around("@annotation(LogExecutionTime)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object proceed = joinPoint.proceed(); // 執行原方法long elapsedTime = System.currentTimeMillis() - start;logger.info("Method {} executed in {} ms", joinPoint.getSignature().getName(), elapsedTime);return proceed;}
}

步驟3: 應用自定義注解

現在,我們可以在任何想要記錄執行時間的方法上使用@LogExecutionTime注解。

@Service
public class MyService {@LogExecutionTimepublic String performTask() {// 模擬耗時操作try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new RuntimeException(e);}return "Task completed!";}
}

步驟4: 配置Spring啟用AOP

確保Spring知道要使用AOP。

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {// 其他配置...
}

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

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

相關文章

新火種AI|蘋果要將蘋果智能做成AI時代的APP Store?

作者:一號 編輯:美美 蘋果還是想要自己做AI時代的“APP Store”。 自從去年開始落了隊,蘋果現在AI上開始高歌猛進。今年WWDC上展示的AI產品和與OpenAI的合作只是開始。有消息稱,蘋果正與Meta等AI巨頭展開深入合作,這…

隨想錄 Day 74 Floyd / A*

隨想錄 Day 74 Floyd / A* Bellman_ford 隊列優化 97. 小明逛公園 時間限制:1.000S 空間限制:256MB 題目描述 小明喜歡去公園散步,公園內布置了許多的景點,相互之間通過小路連接,小明希望在觀看景點的同時&#xff…

小和問題和逆序對問題

小和問題和逆序對問題 小和問題, 在一個數組中,每一個數左邊的數中比當前數小的數累加起來,叫做這個數組的小和,求一個數組的小和 直接遍歷: int littleSum1(int* arr, int L, int R) {int temp 0;for (int i L; …

Spring底層原理之bean的加載方式四 @import 注解

bean的加載方式四 import 第四種bean的導入方式 是import導入的方式 在配置類上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

CesiumJS【Basic】- #041 繪制紋理線(Entity方式)- 需要自定義著色器

文章目錄 繪制紋理線(Entity方式)- 需要自定義著色器1 目標2 代碼2.1 main.ts3 資源文件繪制紋理線(Entity方式)- 需要自定義著色器 1 目標 使用Entity方式繪制紋理線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

Java并發編程:最佳實踐與性能優化

Java并發編程:最佳實踐與性能優化 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 介紹并發編程 在當今軟件開發中,多核處理器和分布式…

K8S學習教程(一):使用PetaExpress云服務器安裝Minikube 集群題

什么是Minikube Minikube是一款工具,主要用于在本地運行 Kubernetes 集群。Kubernetes 開源的平臺,用于自動化容器化應用的部署、擴展和管理,而Minikube 使得開發人員能夠在本地機器上輕松創建一個單節點的 Kubernetes 集群,從而…

【高級篇】第6章 Elasticsearch 高級查詢與搜索優化

在Elasticsearch的深入應用之旅中,掌握高級查詢技巧與優化搜索性能是提升數據處理效率的關鍵。本章將帶你深入探索Elasticsearch的高級查詢特性,揭示搜索性能優化的奧秘,以及如何利用高亮與建議API增強用戶體驗。 6.1 復雜查詢 6.1.1 Nested查詢 Nested基本概念與用法: …

IT設備監控模板:支持多種監控工具和平臺的集成和整合

IT設備監控模板管理在支持多種監控工具和平臺方面發揮著關鍵作用,它通過提供統一的配置和管理界面,使運維人員能夠靈活地適應和整合不同的監控工具和平臺。以下是IT設備監控模板管理如何支持多種監控工具和平臺的具體方式: 一、抽象化和標準…

如何使用AI學習一門編程語言?

無論你是軟件開發新手還是擁有幾十年的豐富經驗,總是需要學習新知識。TIOBE Index追蹤50種最受歡迎的編程語言,許多生態系統為職業發展和橫向轉型提供了機會。鑒于現有技術具有的廣度,抽空學習一項新技能并有效運用技能可能困難重重。 最近我…

ARCGIS python 裁剪柵格函數 arcpy.management.Clip

ARCGIS python 裁剪柵格函數 arcpy.management.Clip 1 功能 裁剪掉柵格數據集、鑲嵌數據集或圖像服務圖層的一部分。 2 使用情況 基于模板范圍提取部分柵格數據集,輸出與模板范圍相交的所有像素使用以 x 和 y 坐標的最小值和最大值確定的包絡矩形或使用輸出范圍文…

MATLAB-振動問題:單自由度阻尼振動系統受迫振動

一、基本理論 二、MATLAB實現 單自由度阻尼振動系統受迫振動,MATLAB代碼如下: clear; clc; close allA 1; psi 0; F0 10; D 20; Rm 0.5; M 1; omega 2; delta Rm / (2*M); omega0 sqrt(D / M); Omega sqrt(omega0^2 - delta^2); Zm Rm i *…

多線程的三種創建方式

繼承Thread類的方式進行實現 public class MyThread extends Thread{ Override public void run(){//多線程具體業務邏輯} }在main方法里面創建子類對象,開啟線程 public static void main(String[] args) {MyThread t1 new MyThread(); MyThread t2 new MyThrea…

LLM大模型工程師面試經驗寶典--基礎版(2024.7月最新)

1.簡單介紹一下大模型【LLMs】? 大模型:一般指1億以上參數的模型,但是這個標準一直在升級,目前萬億參數以上的模型也有了。大語言模型(Large Language Model,LLM)是針對語言的大模型。 2.目前主…

基于布雷格曼偏差校正技術的全變分一維時間序列信號降噪方法(MATLAB R2018A)

信號降噪是信號處理的重要步驟之一,目的是提高所獲得信號數據的質量,以達到更高的定性和定量分析精度。信號降噪能提升信號處理其他環節的性能和人們對信息識別的準確率,給信號處理工作提供更可靠的保證。信號降噪的難點是降低噪聲的同時也會…

69. x 的平方根(簡單)

69. x 的平方根 1. 題目描述2.詳細題解3.代碼實現3.1 Python方法一:逐個遍歷方法二:二分查找 3.2 Java 1. 題目描述 題目中轉:69. x 的平方根 2.詳細題解 不能使用系統內置的函數,尋找某個數(假定為x)的…

網絡請求的高效處理:C++ libmicrohttpd庫詳解

一、libmicrohttpd簡介 libmicrohttpd是一個小型的C語言庫,用于創建HTTP服務器和客戶端。它提供了HTTP 1.1協議的完整實現,包括持久連接、管道化請求、虛擬主機等特性。libmicrohttpd的特點是: 輕量級:易于集成到C或C項目中。跨…

微信好友不小心拉黑了?這樣操作,友誼的小船不會翻

在數字化時代,微信已成為我們社交生活的核心,它不僅連接著親朋好友,更承載著我們的情感與回憶。 然而,情緒波動時,我們可能會一時沖動,將某些好友誤送入黑名單。但別擔心,今天,就讓…

IMU在手語識別中的應用

近期,一款由美國和中國科研團隊聯合研發的新型的穿戴設備——SignRing,以其獨特的IMU(慣性測量單元)技術,為聾啞人士的手語識別帶來了革命性的突破。SignRing不僅極大地擴展了手語識別的詞匯量,更提高了識別…

二維數組-----螺旋性矩陣輸出

題目有點難,ok其實是很難。。。 觀察樣例輸出,不難發現,螺旋數組中元素的遞增軌跡為:右右右、下下下、左左左、上上上 簡明為:右、下、左、上。可以設開始遞增的元素1的位置為(x,y)&#xff0c…