<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      aop在項目中使用的場景?怎么使用?

      AOP(面向切面編程)是一種通過 “橫切” 代碼結構,將分散在多個模塊中的公共邏輯(如日志、事務、權限等)集中管理的編程思想。其核心價值是解耦業(yè)務邏輯與橫切邏輯,減少重復代碼,提高可維護性。在實際項目中,AOP 的應用場景非常廣泛,以下從具體場景、實現(xiàn)方式(以 Spring AOP 為例)展開說明。

      一、AOP 核心概念(快速回顧)

      在講場景前,先明確 AOP 的幾個關鍵術語(以 Spring AOP 為例):
      • 切面(Aspect):封裝橫切邏輯的類(如 “日志切面”“事務切面”),通常用@Aspect注解標記。
      • 切點(Pointcut):定義 “哪些方法需要被攔截”,通過表達式(如execution(* com.xxx.service.*.*(..)))指定攔截范圍。
      • 通知(Advice):切面中具體的橫切邏輯,包括:
        • 前置通知(@Before):方法執(zhí)行前執(zhí)行;
        • 后置通知(@After):方法執(zhí)行后(無論是否異常)執(zhí)行;
        • 返回通知(@AfterReturning):方法正常返回后執(zhí)行;
        • 異常通知(@AfterThrowing):方法拋出異常后執(zhí)行;
        • 環(huán)繞通知(@Around):包裹方法執(zhí)行,可控制方法是否執(zhí)行、修改入?yún)?/ 返回值。
      • 連接點(Joinpoint):程序執(zhí)行過程中可被攔截的點(如方法調用、字段訪問等,Spring AOP 僅支持方法級連接點)。

      二、AOP 在項目中的典型使用場景

      1. 日志記錄(最常用場景)

      需求:記錄接口 / 方法的調用日志(入?yún)ⅰ⒊鰠?、?zhí)行時間、調用者 IP 等),用于問題排查、審計追蹤。痛點:如果在每個接口手動寫日志代碼,會導致大量重復,且修改日志格式需改動所有地方。AOP 解決方案:通過切面統(tǒng)一攔截目標方法,自動記錄日志。

      2. 事務管理

      需求:數(shù)據(jù)庫操作中,確保一系列操作(如 “扣庫存 + 下單”)要么全成功,要么全失?。ˋCID 特性)。痛點:手動編寫try-catch+commit/rollback代碼繁瑣,且容易遺漏事務回滾。AOP 解決方案:Spring 的@Transactional注解底層基于 AOP,通過環(huán)繞通知自動管理事務生命周期(開啟→提交 / 回滾)。

      3. 權限校驗

      需求:接口調用前驗證用戶是否有權限(如 “管理員才能刪除數(shù)據(jù)”),無權限則拒絕訪問。痛點:在每個接口手動寫權限校驗邏輯,代碼冗余,且權限規(guī)則變更需修改所有接口。AOP 解決方案:通過前置通知攔截接口方法,統(tǒng)一校驗權限,無權限則拋出異常。

      4. 異常統(tǒng)一處理

      需求:接口拋出異常時,統(tǒng)一轉換為友好的響應格式(如{code:500, msg:"服務器異常"}),避免直接返回堆棧信息。痛點:每個方法手動try-catch處理異常,代碼冗余,且格式難以統(tǒng)一。AOP 解決方案:通過異常通知攔截方法拋出的異常,統(tǒng)一封裝響應結果。

      5. 性能監(jiān)控

      需求:統(tǒng)計核心方法的執(zhí)行時間,識別性能瓶頸(如 “查詢接口是否超過 100ms”)。痛點:手動在方法前后記錄時間戳,代碼侵入性強,且難以批量統(tǒng)計。AOP 解決方案:通過環(huán)繞通知記錄方法執(zhí)行前后的時間,計算耗時并輸出(或上報監(jiān)控系統(tǒng))。

      6. 緩存控制

      需求:對高頻查詢接口(如 “商品詳情查詢”)添加緩存,減少數(shù)據(jù)庫壓力。痛點:手動寫 “查緩存→無則查庫→更新緩存” 邏輯,代碼重復,且緩存策略難以統(tǒng)一管理。AOP 解決方案:通過環(huán)繞通知攔截查詢方法,自動執(zhí)行緩存邏輯(如結合@Cacheable注解)。

      三、AOP 的具體使用(Spring AOP 示例)

      以 “接口日志記錄” 和 “權限校驗” 為例,展示 AOP 的實現(xiàn)步驟。

      環(huán)境準備

      Spring 項目中需引入 AOP 依賴(Maven):
       
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      
       

      場景 1:接口日志記錄(環(huán)繞通知實現(xiàn))

      目標:攔截所有 Controller 層接口,記錄請求參數(shù)、響應結果、執(zhí)行時間、IP 地址。
       
       
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.Around;
      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Pointcut;
      import org.springframework.stereotype.Component;
      import org.springframework.web.context.request.RequestContextHolder;
      import org.springframework.web.context.request.ServletRequestAttributes;
      
      import javax.servlet.http.HttpServletRequest;
      import java.util.Arrays;
      
      // 1. 定義切面(@Aspect + @Component)
      @Aspect
      @Component
      public class ApiLogAspect {
      
          // 2. 定義切點:攔截com.xxx.controller包下的所有public方法
          @Pointcut("execution(public * com.xxx.controller..*.*(..))")
          public void apiLogPointcut() {}
      
          // 3. 定義環(huán)繞通知:記錄日志
          @Around("apiLogPointcut()")
          public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
              // 3.1 前置邏輯:記錄請求信息
              long startTime = System.currentTimeMillis();
              ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              String ip = request.getRemoteAddr(); // 調用者IP
              String method = request.getMethod(); // HTTP方法(GET/POST)
              String url = request.getRequestURL().toString(); // 請求URL
              String className = joinPoint.getTarget().getClass().getName(); // 類名
              String methodName = joinPoint.getSignature().getName(); // 方法名
              Object[] args = joinPoint.getArgs(); // 方法入?yún)?
              System.out.printf("【請求日志】IP: %s, URL: %s, 方法: %s, 類: %s, 方法名: %s, 入?yún)? %s%n",
                      ip, url, method, className, methodName, Arrays.toString(args));
      
              // 3.2 執(zhí)行目標方法(放行)
              Object result = joinPoint.proceed();
      
              // 3.3 后置邏輯:記錄響應和耗時
              long endTime = System.currentTimeMillis();
              System.out.printf("【響應日志】方法: %s.%s, 出參: %s, 耗時: %dms%n",
                      className, methodName, result, (endTime - startTime));
      
              return result; // 返回方法執(zhí)行結果
          }
      }
      
       

      場景 2:權限校驗(前置通知實現(xiàn))

      目標:攔截標注了@RequirePermission注解的方法,驗證用戶是否擁有指定權限。
      1. 定義權限注解:
       
      import java.lang.annotation.*;
      
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface RequirePermission {
          String value(); // 所需權限(如"admin:delete")
      }
      
       
      1. 實現(xiàn)權限切面: 
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Before;
      import org.aspectj.lang.annotation.Pointcut;
      import org.aspectj.lang.reflect.MethodSignature;
      import org.springframework.stereotype.Component;
      import org.springframework.web.context.request.RequestContextHolder;
      import org.springframework.web.context.request.ServletRequestAttributes;
      
      import javax.servlet.http.HttpServletRequest;
      
      @Aspect
      @Component
      public class PermissionAspect {
      
          // 切點:攔截所有標注了@RequirePermission的方法
          @Pointcut("@annotation(com.xxx.annotation.RequirePermission)")
          public void permissionPointcut() {}
      
          // 前置通知:方法執(zhí)行前校驗權限
          @Before("permissionPointcut()")
          public void checkPermission(JoinPoint joinPoint) {
              // 獲取當前方法的@RequirePermission注解
              MethodSignature signature = (MethodSignature) joinPoint.getSignature();
              RequirePermission annotation = signature.getMethod().getAnnotation(RequirePermission.class);
              String requiredPerm = annotation.value(); // 所需權限
      
              // 從請求中獲取當前用戶的權限(實際項目中可能從Token、Session中獲?。?        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              String userPerm = (String) request.getAttribute("userPermission"); // 假設用戶權限存在request中
      
              // 校驗權限
              if (!requiredPerm.equals(userPerm)) {
                  throw new RuntimeException("權限不足:需要" + requiredPerm + "權限");
              }
          }
      }
      
       
      1. 在接口中使用:
       
      import org.springframework.web.bind.annotation.DeleteMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      public class UserController {
      
          // 標注需要"admin:delete"權限
          @DeleteMapping("/user/{id}")
          @RequirePermission("admin:delete")
          public String deleteUser(Long id) {
              // 業(yè)務邏輯:刪除用戶
              return "刪除成功";
          }
      }
      
       

      四、AOP 使用注意事項

      1. 切點表達式精準性:避免切點范圍過大(如攔截所有方法),導致性能損耗;也避免過小,遺漏需要攔截的方法。常用表達式:
        • execution(* com.xxx.service.*.*(..)):攔截 service 包下所有類的所有方法;
        • @annotation(com.xxx.annotation.Log):攔截標注了 @Log 注解的方法。
      2. 通知執(zhí)行順序:多個切面攔截同一方法時,可通過@Order(n)指定優(yōu)先級(n 越小優(yōu)先級越高)。
      3. 性能影響:環(huán)繞通知會包裹方法執(zhí)行,過度使用可能增加耗時,核心高頻接口需謹慎。
      4. 異常處理:通知中若拋出未捕獲的異常,會影響目標方法執(zhí)行(如事務切面需確保異常正確傳播)。

      總結

      AOP 的核心是 “將橫切邏輯集中管理”,在日志、事務、權限等場景中能極大減少重復代碼,提高項目可維護性。Spring AOP 通過注解(@Aspect@Pointcut、@Around等)簡化了 AOP 的使用,只需定義切面、切點和通知,即可實現(xiàn)對目標方法的無侵入式增強。實際項目中,需根據(jù)業(yè)務場景選擇合適的通知類型,并注意切點精準性和性能影響。
      posted @ 2025-10-28 09:35  郭慕榮  閱讀(40)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 福利视频在线一区二区| 久久一日本综合色鬼综合色| 日韩中文字幕有码av| 色婷婷五月综合亚洲小说 | 国产精品一二三区蜜臀av| 国内精品久久久久影院网站| 成年无码av片在线蜜芽| 久久中文字幕无码一区二区| 久久这里只精品国产2| 亚洲精品成人久久久| 柳江县| 一区天堂中文最新版在线| 最近中文字幕国产精品| 98精品全国免费观看视频| 男女xx00xx的视频免费观看| 日韩深夜福利视频在线观看| 精品国产高清中文字幕| 欧美一区二区三区成人久久片| 欧美伦费免费全部午夜最新| 亚洲狠狠婷婷综合久久久久图片 | 国产精品国产三级国产a| 亚洲国产精品无码一区二区三区| 国产午夜一区二区在线观看| 老鸭窝| 亚洲高清免费在线观看| 精品国产亚洲av麻豆特色| 国产欧美精品aaaaaa片| 韩国无码AV片午夜福利| 亚洲天堂成年人在线视频| 亚洲日本韩国欧美云霸高清| 精品国产精品午夜福利| 亚洲中文字幕人妻系列| 国偷自产一区二区三区在线视频 | 无套内射视频囯产| 欧美一区二区三区成人久久片| 人妻va精品va欧美va| 国产精品国产高清国产一区| jlzz大jlzz大全免费| 无码伊人66久久大杳蕉网站谷歌| 国产精品一区二区三区麻豆| 免费视频一区二区三区亚洲激情 |