SpringBoot之AOP使用


說到SpringBoot,難免會想到Spring。
對於Spring,我曾用其開發過很多大大小小的項目。
當使用SpringBoot之后,給人最直觀的感受,用古人一句話:”大道至簡”。

SpringBoot相比Spring,它的優點其實就是Spring的缺點或不足:

(1)內嵌入Tomcat、Jetty等容器,無需Tomcat就能直接跑起來(這讓我想到開發一個龐大的項目,光啟動Tomcat就需要花好幾分鍾);

(2)部署方便,一個可執行的Jar,你可以將其以Docker容器的形式管理部署,也可以使用nohub命令讓其持久運行在服務器上;

(3)無需管理一大堆繁重的xml配置(記得初次接觸Spring的時候,它給最直觀的感受就是將對象交給Spring管理,其實也就是在對應的xml進行配置,不再像很久以前那樣自己New之類的,New十幾二十個還好,但是一個實際項目,對象太龐大了,如果沿用傳統new的方式來管理對象的話,那么將會耗費很多時間精力在這上面,不能很好的集中精力進行業務開發,因為需要考慮對象的初始化以及銷毀等),而當我使用SpringBoot以后開發項目,基本上SpringBoot很好的集成第三方庫,需要什么就是直接在application.yml或application.properties直接配置即可;

(4)提供的starter-web簡化Maven配置(整合常用依賴,相當於將一些web常用jar集成進去,省的我們一個個導入還需要考慮版本兼容性問題);

可以從spring-boot-starter-web依賴傳遞可以看出,如圖:

 

 

(5)創建獨立的Spring應用(更好的適用於微服務開發);

SpringAOP的應用場景

從實際開發出發,舉兩個典型例子簡單概括一下:
(1)可用於做接口權限控制或者是權限控制;
(2)可用於檢測接口請求並統計接口請求次數;

實際上可以從這么幾個方面深入挖掘?
(1)日志記錄;
(2)性能統計;
(3)安全控制(可以理解為權限控制);
(4)事務處理;
(5)異常處理;

我想每個Java開發者對於這五個方面再了解不過了。

以監聽接口請求為例

核心代碼如下:

package com.blog.springboot.aop;
import java.util.HashMap;
import java.util.Map;
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 cn.hutool.core.lang.Console;
/**
 * 系統日志類(用於統計接口請求)
 * @author youcong
 * @date 2019-09-05
 */
@Aspect
@Component
public class SystemLogAspect {

    
  @Pointcut("execution(public * com.blog.springboot.controller..*.*(..))")
  public void Pointcut() {
  
      Console.log("走你");
  }
 
 
    //@Around:環繞通知
    @Around("Pointcut()")
    public Object Around(ProceedingJoinPoint pjp) throws Throwable {
        Map<String,Object> data = new HashMap<>();
        //獲取目標類名稱
        String clazzName = pjp.getTarget().getClass().getName();
        //獲取目標類方法名稱
        String methodName = pjp.getSignature().getName();
 
        //記錄類名稱
        data.put("clazzName",clazzName);
        //記錄對應方法名稱
        data.put("methodName",methodName);
        //記錄請求參數
        data.put("params",pjp.getArgs());
        //開始調用時間
        // 計時並調用目標函數
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        Long time = System.currentTimeMillis() - start;
 
        //記錄返回參數
        data.put("result",result);
 
        //設置消耗總時間
        data.put("consumeTime",time);
        System.out.println(data);
        return result;
 
    }


}

基本上每次請求接口都會獲取到對應的接口信息並輸出。

如果后台這邊需要統計接口請求次數,針對某些接口請求非常頻繁,可考慮加緩存或者是進行其它優化等。

SpringAOP之常用注解

簡單的說一下AOP,AOP又稱面向切面編程,它的常用術語如下:

連接點(Joinpoint)

增強程序執行的某個特定位置(要在哪個地方做增強操作)。SPring僅支持方法的連接點,既僅能在方法調用前,方法調用后,方法拋出異常時等這些程序執行點進行織入增強。

切點(Pointcut)

切點是一組連接點的集合。AOP通過”切點”定位特定的連接點。通過數據庫查詢的概念來理解切點和連接點的關系再適合不過來:連接點相當於數據庫中的記錄,而切點相當於查詢條件。

增強(Advice)

增強是織入到目標類連接點上的一段程序代碼。表示要在連接點上做的操作。

切面(Aspect)

切面由切點和增強(引介)組成(可以包含多個切點和多個增強),它既包括橫切邏輯的定義,也包括連接點的定義,SpringAOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的鏈接點中。

SpringAOP常用注解如下:
@aspect(定義切面)
@pointcut(定義切點)
@before(標注Before Advice定義所在的方法)
@afterreturning(標注After Returning Advice定義所在的方法)
@afterthrowing(標注After Throwing Advice定義所在的方法)
@after(標注After(Finally)Advice定義所在的方法)
@around(標注Around Advice定義所在的方法)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM