在我們開發的過程中經常會有這樣的需求,每乙個請求需要判斷許可權,校驗引數,列印日製等,但是每乙個方法都寫這樣重複的**無疑會讓**很冗餘,於是可以想到用aop切面的方式可以一次性解決所有的煩勞。
其實我們通過aop機制可以實現:authentication 許可權檢查、caching 快取、引數校驗、context passing 內容傳遞、error handling 錯誤處理、日誌列印等功能,這裡我們講一下怎麼從0開始手寫乙個spring aop來實現前置通知或後置通知。
一:新增pom依賴
org.springframework.boot<
/groupid>
spring-boot-starter-aop<
/artifactid>
<
/dependency>
二:新建乙個aop包,定義乙個切面
一般會專門新建乙個包用來處理aop,我這裡新建乙個package org.sang.org.sang.advice包,並且新建乙個logadvice類。
package org.sang.org.sang.advice;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.pointcut;
import org.springframework.stereotype.component;
/** * create by 86159 on 2020/11/2
*/@aspect
@component
public
class
logadvice
這裡注意要加上註解@aspect,申明是個切面類,@component能夠掃瞄到。
三:定義乙個切面
package org.sang.org.sang.advice;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.pointcut;
import org.springframework.stereotype.component;
/** * create by 86159 on 2020/11/2
*/@aspect
@component
public
class
logadvice
}
四:前置通知
package org.sang.org.sang.advice;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.before;
import org.aspectj.lang.annotation.pointcut;
import org.springframework.stereotype.component;
/** * create by 86159 on 2020/11/2
*/@aspect
@component
public
class
logadvice
@before
("logadvicepoint()"
)public
void
beforeadvice()
}
在切面的基礎上構建前置通知,前置通知是用@before註解,括號裡的引數為切面的名稱,前置通知的方法體內為在呼叫方法前要處理的業務邏輯,比如許可權校驗,引數校驗等等。
五:後置通知
package org.sang.org.sang.advice;
import org.aspectj.lang.annotation.after;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.before;
import org.aspectj.lang.annotation.pointcut;
import org.springframework.stereotype.component;
/** * create by 86159 on 2020/11/2
*/@aspect
@component
public
class
logadvice
@before
("logadvicepoint()"
)public
void
beforeadvice()
@after
("logadvicepoint()"
)public
void
afteradvice()
}
後置通知用@after註解,同樣括號裡為切面名稱,方法體內為呼叫方法完成後需要處理的業務邏輯,如列印日誌記錄。
下面我們寫個方法測試下效果:
package org.sang.controller;
import org.sang.model.entity.user;
import org.sang.service.userservice;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.validation.annotation.validated;
import org.springframework.web.bind.annotation.*;
@restcontroller
(value =
"/user"
)public
class
usercontroller
我們用postman呼叫方法測試結果如下:
post請求advice被觸發了。。。。。。。。。。。。,校驗許可權,引數有效性
儲存使用者開始執行。。。
請求完畢,列印日製記錄
可以看到,在呼叫方法前和方法後都執行相應的前置通知和後置通知的邏輯**,這樣乙個簡單的aop就實現了。
另外還有其他的通知:@around,@afterreturning,@afterthrowing
這裡簡單介紹一下,切面的執行方法和其執行順序:
@around 通知方法將目標方法封裝起來
@before 通知方法會在目標方法呼叫之前執行
@after 通知方法會在目標方法返回或者異常後執行
@afterreturning 通知方法會在目標方法返回時執行
@afterthrowing 通知方法會在目標方法丟擲異常時執行
從零搭建 Spring Boot 後端專案(一)
簡介 這一小節主要是初始化專案,以及建立好相應的目錄結構步驟 接下來新建如下的 目錄,和相關的配置檔案,目的在於規範我們的專案結構,之後的操作都將依賴此結構 層結構 資源目錄結構 靜態資源目錄 resources static 檢視模板目錄 resources templates mybatis配置...
從零搭建 Spring Boot 後端專案(六)
簡介 這一小節主要是為了,統一請求結果格式步驟 注 這裡統一的返回結果,只能保證我們沒有丟擲異常的情況,統一返回結果,但是程式丟擲異常後,返回結果將不再統一,此時我們需要全域性異常處理,再統一返回資料,下面會寫到 測試這裡可以把controller返回的資料放到resultdata類的data下返回...
SpringBoot從零開始(一)
上來先看的這篇部落格 idea新建乙個springboot mybatis mysql專案,以及遇到的問題分享。在其中第9步自動生成的過程中,出現了錯誤如下 the server time zone value is unrecognized or represents more than one ...