說到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定義所在的方法)
