Spring框架基于AOP實(shí)現(xiàn)簡(jiǎn)單日志管理步驟解析
SPringAOP的使用
技術(shù)概述,描述這個(gè)技術(shù)是做什么?學(xué)習(xí)該技術(shù)的原因,技術(shù)的難點(diǎn)在哪里。
為了實(shí)現(xiàn)項(xiàng)目管理員端的操作數(shù)據(jù)庫(kù)日志,便于方便所以利用Spring框架的AOP機(jī)制進(jìn)行實(shí)現(xiàn),項(xiàng)目的難點(diǎn)在于如果設(shè)置切入點(diǎn),如何獲取參數(shù)。
技術(shù)詳述,描述你是如何實(shí)現(xiàn)和使用該技術(shù)的,要求配合代碼和流程圖詳細(xì)描述??梢栽偌?xì)分多個(gè)點(diǎn),分開(kāi)描述各個(gè)部分。
在applicationContext.xml中開(kāi)啟AOP代理
<aop:aspectj-autoproxy />
自定義一個(gè)注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnno {
String operatorType();
}
編寫一個(gè)切面類
@Component
@Aspect
public class LogAopAspect {
@Autowired
LogtableService logtableService;//Logtable為數(shù)據(jù)庫(kù)中的一張表,用于存儲(chǔ)日志信息
@Around("@annotation(qj.admin.aspect.LogAnno)")//設(shè)定需要捕獲的標(biāo)簽
public Object around(ProceedingJoinPoint pjp) throws Throwable
{
MethodSignature methodSignature =(MethodSignature)pjp.getSignature();
Method method = methodSignature.getMethod();
String targetName = pjp.getTarget().getClass().getName();
System.out.println("增強(qiáng)的類是:"+targetName);
System.out.println("增強(qiáng)的方法是:"+method.getName());
Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), method.getParameterTypes());
LogAnno logAnno = realMethod.getAnnotation(LogAnno.class);//獲取注解的方法上的自定義標(biāo)簽類
String operatortype = logAnno.operatorType();//獲取到自定義標(biāo)簽上的注解如“修改賬戶狀態(tài)”
//String operatortype = "修改用戶積分";
AdminLog adminLog = new AdminLog();
adminLog.setOperatortype(operatortype);
adminLog.setOperator("123");
Object resultObject = null;
Object [] parameter = pjp.getArgs();//獲取注解的方法的傳入?yún)?shù)
try {
resultObject = pjp.proceed();
adminLog.setOperatorresult("正常 "+Arrays.toString(parameter));
} catch (Exception e) {
// TODO: handle exception
adminLog.setOperatorresult("失敗");
}
finally {
adminLog.setOperatordate(new Date());
logtableService.addLog(adminLog);
}
return resultObject;
}
用自定義注解注解一個(gè)方法
@LogAnno(operatorType = "修改賬戶狀態(tài)")
public void handleUser(int IDNumber, int type) {
User user = userDAO.get(IDNumber);
userDAO.update(user, type);
}
項(xiàng)目目錄結(jié)構(gòu)

技術(shù)使用中遇到的問(wèn)題和解決過(guò)程。要求問(wèn)題的描述和解決有一定的內(nèi)容,不能草草概括。要讓遇到相關(guān)問(wèn)題的人看了你的博客之后能夠解決該問(wèn)題。
剛剛開(kāi)始的時(shí)候時(shí)候僅僅利用Method method = methodSignature.getMethod();來(lái)獲取當(dāng)前增強(qiáng)的方法,但是在接下來(lái)的LogAnno logAnno = method.getAnnotation(LogAnno.class);中g(shù)et到的logAnno類為空,而上面通過(guò)打印System.out.println("增強(qiáng)的方法是:"+method.getName());顯示增加的方法并沒(méi)有錯(cuò)誤,導(dǎo)致這就陷入了我的知識(shí)盲區(qū),經(jīng)過(guò)查找資料,大部分教程都說(shuō)在自定義注解類中添加@Retention(RetentionPolicy.RUNTIME)即可解決問(wèn)題,但是我添加之后還是同樣的問(wèn)題,最后意識(shí)到,可能這方法所獲取的函數(shù)是兩個(gè)不同的函數(shù),最后又經(jīng)過(guò)查找最終發(fā)現(xiàn)原來(lái)是這個(gè)aop攔截的是ServiceImpl的一個(gè)方法,然后這個(gè)ServiceImpl又啟動(dòng)了事務(wù)管理,而事務(wù)管理又是基于AOP的。
也就是說(shuō),這個(gè)權(quán)限的@Around的切面攔截的是個(gè)代理對(duì)象的方法,而代理對(duì)象的方法是不會(huì)把原來(lái)父類中的方法的注解加上去的,所以這里這個(gè)注解的對(duì)象為null。
最后運(yùn)用Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), method.getParameterTypes());獲取到了真正需要的增強(qiáng)的函數(shù)。
總結(jié)
利用Spring的AOP機(jī)制確實(shí)能夠大大減少代碼量,很容易的就實(shí)現(xiàn)了日志的管理
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié)
這篇文章主要介紹了Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
詳解Java如何實(shí)現(xiàn)企業(yè)微信審批流程
這篇文章主要使用了一個(gè)Java示例代碼,來(lái)向大家展示如何在企業(yè)微信中實(shí)現(xiàn)審批流程,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考下2024-11-11
IntelliJ IDEA安裝插件阿里巴巴Java開(kāi)發(fā)手冊(cè)(Alibaba Java Coding Guidelines
這篇文章主要介紹了IntelliJ IDEA安裝插件阿里巴巴Java開(kāi)發(fā)手冊(cè)(Alibaba Java Coding Guidelines),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
深入聊一聊springboot項(xiàng)目全局異常處理那些事兒
最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目全局異常處理那些事兒,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例
規(guī)則引擎其實(shí)是一種組件,它可以嵌入到程序當(dāng)中,將程序復(fù)雜的判斷規(guī)則從業(yè)務(wù)代碼中剝離出來(lái),使得程序只需要關(guān)心自己的業(yè)務(wù),而不需要去進(jìn)行復(fù)雜的邏輯判斷,本文給大家介紹了SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例,需要的朋友可以參考下2024-12-12
Flink結(jié)合Kafka實(shí)現(xiàn)通用流式數(shù)據(jù)處理
這篇文章將和大家一起深入探討Flink和Kafka的關(guān)系以及它們?cè)跀?shù)據(jù)流處理中的應(yīng)用,并提供一些最佳實(shí)踐和實(shí)際案例,希望對(duì)大家有一定的幫助2025-03-03
Java基于Graphics2D實(shí)現(xiàn)海報(bào)制作
這篇文章主要為大家詳細(xì)介紹了Java如何基于Graphics2D實(shí)現(xiàn)海報(bào)制作,并且支持自定義顏色,背景,logo,貼圖,感興趣的小伙伴可以了解一下2024-04-04

