機(jī)緣巧合屁柏,看到一個(gè)后臺(tái)管理工程,因其用Spring Boot + Shiro搭的腳手架有送,所以就想看看學(xué)習(xí)學(xué)習(xí)淌喻。在這中間,學(xué)到了個(gè)小技巧雀摘。運(yùn)用AOP實(shí)現(xiàn)對(duì)用戶操作日志異步存儲(chǔ)裸删。
AOP(面向切面編程),其彌補(bǔ)了OOP在橫向上的局限阵赠,最為典型的就是日志管理涯塔。這也可謂是老生常談(可以看看aop-introduction),但是我對(duì)它的認(rèn)識(shí)并不深刻清蚀,今天通過這個(gè)工程剖析一下匕荸。
實(shí)現(xiàn)目標(biāo):用戶在操作系統(tǒng)的每一步都記錄下來,操作過程中枷邪,后臺(tái)對(duì)應(yīng)哪個(gè)類哪個(gè)方法等詳細(xì)信息都將存入MySQL定義的日志表中榛搔,方便管理。
1.MySQL數(shù)據(jù)庫(kù)中齿风,已經(jīng)有一張操作日志表药薯,通過show create table operation_log;看看表結(jié)構(gòu)情況。
2.系統(tǒng)中定義個(gè)POJO對(duì)象救斑,與數(shù)據(jù)庫(kù)內(nèi)的表結(jié)構(gòu)相對(duì)應(yīng)童本。這其中作者選擇Mybatis-Plus做為ORM框架。
3.聲明一個(gè)注解脸候,這樣只要是使用該注解的地方就是AOP的切點(diǎn)
4.定義一個(gè)類穷娱,實(shí)現(xiàn)當(dāng)引用該BussinessLog注解時(shí),自動(dòng)完成操作日志入庫(kù)运沦。
這里就涉及到AOP的核心內(nèi)容了泵额,讓我們先來看看Spring AOP由哪些元素組成。
A pointcut declaration has two parts: a signature comprising a name and any parameters, and a pointcut expression that determines?exactly?which method executions we are interested in.
例如:
@Pointcut(value="@annotation(com.stylefeng.guns.common.annotion.log.BussinessLog)")//就是a pointcut expression the pointcut expression携添。
其匹配模式可以有如下幾種:
上訴示例即對(duì)有應(yīng)用com.stylefeng.guns.common.annotion.log.BussinessLog進(jìn)行注解的方法進(jìn)行橫切面攔截嫁盲。
public void cutService() {}? //the pointcut signature
@Around("cutService()")
在advice中處理這個(gè)Pointcut(記錄操作日志),這里的的advice使用的是Around
在Spring AOP中支持如下幾種類型advice:
作者在該處運(yùn)用Around advice,并通過point.proceed()烈掠,先執(zhí)行切點(diǎn)所在位置的業(yè)務(wù)邏輯羞秤,然后通過handle(point)處理切點(diǎn)的業(yè)務(wù)邏輯(即將用戶操作日志寫入數(shù)據(jù)庫(kù))缸托。其實(shí),我個(gè)人覺得After returning advice更適合瘾蛋,這樣就無須point.proceed俐镐。
ProceedingJoinPoint?point該對(duì)象封裝了連接點(diǎn)的信息,其繼承自JoinPoint哺哼,該接口能夠獲得切點(diǎn)處的狀態(tài)佩抹。
讓我們?cè)倏纯磆andle:
LogManager中則是通過ScheduledThreadPoolExecutor線程池,定期執(zhí)行TimerTask任務(wù)取董。
TimerTask則是通過LogTaskFactory工廠類來創(chuàng)建的棍苹,其中operationLogMapper.insert(operationLog)即向數(shù)據(jù)庫(kù)中插入操作日志記錄,Mybatis-Plus已經(jīng)為你實(shí)現(xiàn)甲葬,你只需要將interface OperationLogMapper extends BaseMapper<OperationLog>?
總結(jié)廊勃,通過定義切點(diǎn),切點(diǎn)處的業(yè)務(wù)處理邏輯经窖,實(shí)現(xiàn)在每個(gè)操作數(shù)據(jù)庫(kù)的動(dòng)作記錄均被切點(diǎn)撲捉到,并通過切點(diǎn)處的業(yè)務(wù)邏輯實(shí)現(xiàn)對(duì)動(dòng)作的入庫(kù)梭灿,這就是AOP的魅力画侣。詳細(xì)了解AOP請(qǐng)閱讀aop-introduction