目錄
介紹
1.1 什么是AOP
1.2 AOP體系與概念
AOP簡單實(shí)現(xiàn)
2.1 新建一個(gè)SpringBoot項(xiàng)目,無需選擇依賴
2.2 設(shè)置好本地Maven配置后,在pom.xml文件里添加添加maven依賴
2.3 創(chuàng)建一個(gè)業(yè)務(wù)類接口
2.4 在實(shí)體類實(shí)現(xiàn)接口業(yè)務(wù)?
2.5 在單元測試運(yùn)行結(jié)果
2.6?創(chuàng)建切面類
2.7?再次運(yùn)行測試
?總結(jié)
介紹
1.1 什么是AOP
????????AOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(兩外兩個(gè):IOC-控制反轉(zhuǎn)、DI-依賴注入)。
????????那么AOP為何那么重要呢?
????????在我們的程序中,經(jīng)常存在一些系統(tǒng)性的需求,比如權(quán)限校驗(yàn)、日志記錄、統(tǒng)計(jì)等,這些代碼會散落穿插在各個(gè)業(yè)務(wù)邏輯中,例如下面這個(gè)示意圖:
?
????????有多少業(yè)務(wù)操作,就要寫多少重復(fù)的校驗(yàn)和日志記錄代碼,這顯然是無法接受的。當(dāng)然,用面向?qū)ο蟮乃枷?,我們可以把這些重復(fù)的代碼抽離出來,寫成公共方法,就是下面這樣:
?
????????這樣,代碼冗余和可維護(hù)性的問題得到了解決,但每個(gè)業(yè)務(wù)方法中依然要依次手動調(diào)用這些公共方法,也是略顯繁瑣。有沒有更好的方式呢?有的,為了解決這個(gè)問題,面向切面編程(AOP)應(yīng)運(yùn)而生。AOP將權(quán)限校驗(yàn)、日志記錄等非業(yè)務(wù)代碼完全提取出來,與業(yè)務(wù)代碼分離,并尋找節(jié)點(diǎn)切入業(yè)務(wù)代碼中:
?
??????AOP通過預(yù)編譯方式和運(yùn)行動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù),AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生泛型。利用AOP可以對業(yè)務(wù)邏輯的各部分進(jìn)行隔離,是開發(fā)人員在編寫業(yè)務(wù)邏輯時(shí),專注核心業(yè)務(wù),從而降低業(yè)務(wù)邏輯各模塊之間的耦合度,提高代碼重用和開發(fā)效率。??
????????AOP使用橫向抽取機(jī)制,取代縱向集成體系的重復(fù)代碼建設(shè)。使用Aspect,使業(yè)務(wù)邏輯只關(guān)注業(yè)務(wù)本身,將日志管理、事務(wù)處理、性能統(tǒng)計(jì)、異常處理、權(quán)限控制等代碼從業(yè)務(wù)邏輯代碼中抽離,從而實(shí)現(xiàn)改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯代碼。
1.2 AOP體系與概念
Spring AOP和AspectJ
????????目前流行的AOP框架分別為Spring AOP和AspectJ。
AOP相關(guān)術(shù)語
簡單地去理解,其實(shí)AOP要做三類事:
-
在哪里切入,也就是權(quán)限校驗(yàn)等非業(yè)務(wù)操作在哪些業(yè)務(wù)代碼中執(zhí)行。
-
在什么時(shí)候切入,是業(yè)務(wù)代碼執(zhí)行前還是執(zhí)行后。
-
切入后做什么事,比如做權(quán)限校驗(yàn)、日志記錄等。
因此,AOP的體系可以梳理為下圖:
?
AOP簡單實(shí)現(xiàn)
? ? ? ? 下面我們通過一個(gè)簡單的案例來演示一下AOP的初級應(yīng)用:
2.1 新建一個(gè)SpringBoot項(xiàng)目,無需選擇依賴
2.2 設(shè)置好本地Maven配置后,在pom.xml文件里添加添加maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.3 創(chuàng)建一個(gè)業(yè)務(wù)類接口
?????????如圖,建立對應(yīng)的軟件包和接口,并在接口創(chuàng)建方法:
2.4 在實(shí)體類實(shí)現(xiàn)接口業(yè)務(wù)?
????????注意,一定要添加Service注解?
2.5 在單元測試運(yùn)行結(jié)果
2.6?創(chuàng)建切面類
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.StringJoiner;
@Component
@Aspect
public class LogAspect {
@Before("execution(* com.example.aopdemo.service..*.*(..))")
public void sysLog(JoinPoint jp){
StringJoiner log = new StringJoiner("|","{","}");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
log.add(formatter.format(LocalDateTime.now()));
//當(dāng)前執(zhí)行的業(yè)務(wù)方法名稱
String methodName = jp.getSignature().getName();
log.add(methodName);
//方法的參數(shù)
Object[] args = jp.getArgs();
for(Object arg:args){
log.add(arg == null ? "-" : arg.toString() );
}
System.out.println("AOP日志啟動!" + log);
}
2.7?再次運(yùn)行測試
????????再次運(yùn)行就發(fā)發(fā)現(xiàn)我們的日志已經(jīng)添加進(jìn)去了,并且沒有對原代碼進(jìn)行改變,這就是AOP的絲滑之處。
文章來源:http://www.zghlxwxcb.cn/news/detail-619726.html
?總結(jié)
????????AOP使用橫向抽取機(jī)制,取代縱向集成體系的重復(fù)代碼建設(shè)。使用Aspect,使業(yè)務(wù)邏輯只關(guān)注業(yè)務(wù)本身,將日志管理、事務(wù)處理、性能統(tǒng)計(jì)、異常處理、權(quán)限控制等代碼從業(yè)務(wù)邏輯代碼中抽離,從而實(shí)現(xiàn)改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯代碼。實(shí)乃開發(fā)必備之神器也,本文到此就結(jié)束了,希望大家可以有所收獲~文章來源地址http://www.zghlxwxcb.cn/news/detail-619726.html
到了這里,關(guān)于使用Spring Boot AOP實(shí)現(xiàn)日志記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!