最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義注解之實(shí)現(xiàn)AOP切面日志詳解

 更新時間:2022年09月02日 16:20:36   作者:你是我的小丫小太陽  
這篇文章主要為大家詳細(xì)介紹了SpringBoot自定義注解之實(shí)現(xiàn)AOP切面統(tǒng)一打印出入?yún)⑷罩?,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

通過自定義注解的方式(如:@SysLog(obj = "操作對象", text = "操作內(nèi)容"),在 SpringBoot 中來實(shí)現(xiàn) AOP 切面統(tǒng)一打印出入?yún)⑷罩尽?/p>

一、先看下項目結(jié)構(gòu)

二、Maven JAR依賴

<!-- AOP -->
? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

三、自定義注解

@SysLog

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
?
?
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SysLog {
?
? ? /**
? ? ?* 操作對象
? ? ?* **/
? ? String obj() default "";
?
? ? /**
? ? ?* 操作內(nèi)容
? ? ?* **/
? ? String text() default "";
}

四、AOP切面

import java.lang.reflect.Method;
?
import com.zxk.demo.annotation.SysLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
?
?
@SuppressWarnings("all")
@Aspect
@Component
public class SysLogAspect {
?
? ? // 切入點(diǎn)
? ? @Pointcut(value = "@annotation(com.zxk.demo.annotation.SysLog)")
? ? private void pointcut() {
? ? }
?
? ? /**
? ? ?* 在方法執(zhí)行前
? ? ?* @param point
? ? ?* @param myLog
? ? ?* @return
? ? ?*/
? ? @Before(value = "pointcut() && @annotation(sysLog)")
? ? public void before(SysLog sysLog){
? ? ? ? System.out.println("++++執(zhí)行了before方法++++");
? ? }
?
?
? ? /**
? ? ?* 在方法執(zhí)行前后
? ? ?* @param point
? ? ?* @param myLog
? ? ?* @return
? ? ?*/
? ? @Around(value = "pointcut() && @annotation(sysLog)")
? ? public Object around(ProceedingJoinPoint point, SysLog sysLog) {
? ? ? ? System.out.println("++++執(zhí)行了around方法++++");
? ? ? ? String obj = sysLog.obj();
? ? ? ? String text = sysLog.text();
? ? ? ? // 攔截的類名
? ? ? ? Class clazz = point.getTarget().getClass();
? ? ? ? // 攔截的方法
? ? ? ? Signature sig = point.getSignature();
? ? ? ? MethodSignature msig = null;
? ? ? ? if (!(sig instanceof MethodSignature)) {
? ? ? ? ? ? throw new IllegalArgumentException("該注解只能用于方法");
? ? ? ? }
? ? ? ? msig = (MethodSignature) sig;
? ? ? ? Object target = point.getTarget();
? ? ? ? Method currentMethod;
? ? ? ? try {
? ? ? ? ? ? currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
? ? ? ? ? ? System.out.println("執(zhí)行了類:" + clazz.getSimpleName());
? ? ? ? ? ? System.out.println("方法:" + currentMethod.getName());
? ? ? ? ? ? System.out.println("自定義注解:" + obj+"==="+text);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? try {
? ? ? ? ? ? return point.proceed(); // 執(zhí)行程序
? ? ? ? } catch (Throwable throwable) {
? ? ? ? ? ? throwable.printStackTrace();
? ? ? ? ? ? return throwable.getMessage();
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 方法執(zhí)行后
? ? ?* @param joinPoint
? ? ?* @param myLog
? ? ?* @param result
? ? ?* @return
? ? ?*/
? ? @AfterReturning(value = "pointcut() && @annotation(sysLog)", returning = "result")
? ? public Object afterReturning(JoinPoint joinPoint, SysLog sysLog, Object result) {
? ? ? ? // HttpServletRequest request = ((ServletRequestAttributes)
? ? ? ? // RequestContextHolder.getRequestAttributes()).getRequest();
? ? ? ? // HttpSession session = request.getSession();
? ? ? ? /**
? ? ? ? ?* 將信息保存到數(shù)據(jù)庫
? ? ? ? ?* **/
? ? ? ? System.out.println("++++執(zhí)行了afterReturning方法++++");
? ? ? ? System.out.println("自定義注解:" + sysLog.obj()+"=="+sysLog.text());
? ? ? ? System.out.println("執(zhí)行結(jié)果:" + result);
? ? ? ? return result;
? ? }
?
? ? /**
? ? ?* 方法執(zhí)行后 并拋出異常
? ? ?* @param joinPoint
? ? ?* @param myLog
? ? ?* @param ex
? ? ?*/
? ? @AfterThrowing(value = "pointcut() && @annotation(sysLog)", throwing = "ex")
? ? public void afterThrowing(JoinPoint joinPoint, SysLog sysLog, Exception ex) {
? ? ? ? System.out.println("++++執(zhí)行了afterThrowing方法++++");
? ? ? ? System.out.println("請求:" + sysLog.text() + " 出現(xiàn)異常");
? ? }
}

五、Controller層實(shí)現(xiàn)

@SysLog(obj = "操作對象", text = "操作內(nèi)容")
@GetMapping("/index")
? ? public String hello() {
// ? ? ? ?int num = 5/0;
// ? ? ? ?System.out.println("執(zhí)行結(jié)果:" + num);
? ? ? ? return "hello word";
? ? }

六、測試

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中創(chuàng)建線程池的幾種方式以及區(qū)別

    Java中創(chuàng)建線程池的幾種方式以及區(qū)別

    創(chuàng)建線程池有多種方式,主要通過 Java 的 java.util.concurrent 包提供的 Executors 工具類來實(shí)現(xiàn),本文給大家介紹了幾種常見的線程池類型及其區(qū)別,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • java使用RSA工具進(jìn)行信息加解密

    java使用RSA工具進(jìn)行信息加解密

    我們在開發(fā)中需要對用戶敏感數(shù)據(jù)進(jìn)行加解密,比如密碼等信息,這篇文章主要為大家詳細(xì)介紹了java如何使用RSA工具進(jìn)行信息加解密,感興趣的小伙伴可以了解下
    2023-12-12
  • Java遍歷集合的三種方式

    Java遍歷集合的三種方式

    本文主要對于遍歷集合獲取其對象,總結(jié)的三種簡單的方式進(jìn)行介紹,文章中舉了兩個案例進(jìn)行對比,具有很好的參考價值,下面就跟小編一起來看下吧
    2016-12-12
  • Java中memcached的cache機(jī)制

    Java中memcached的cache機(jī)制

    這篇文章主要介紹了Java中memcached的cache機(jī)制,在Java中使用Memcached的緩存機(jī)制需要使用Java的Memcached客戶端庫。Memcached是一個高性能的分布式內(nèi)存緩存系統(tǒng),可以用來緩存常用的數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • spring boot項目快速構(gòu)建的全步驟

    spring boot項目快速構(gòu)建的全步驟

    這篇文章主要給大家介紹了關(guān)于spring boot項目快速構(gòu)建的全步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Spark SerializedLambda錯誤的兩種解決方案

    Spark SerializedLambda錯誤的兩種解決方案

    這篇文章主要介紹了Spark SerializedLambda錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java多線程編程之使用thread類創(chuàng)建線程

    java多線程編程之使用thread類創(chuàng)建線程

    在Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口。在使用Runnable接口時需要建立一個Thread實(shí)例
    2014-01-01
  • idea使用war以及war exploded的區(qū)別說明

    idea使用war以及war exploded的區(qū)別說明

    本文詳細(xì)解析了war與warexploded兩種部署方式的差異及步驟,war方式是先打包成war包,再部署到服務(wù)器上;warexploded方式是直接把文件夾、class文件等移到Tomcat上部署,支持熱部署,開發(fā)時常用,文章分別列出了warexploded模式和war包形式的具體操作步驟
    2024-10-10
  • java實(shí)現(xiàn)微信公眾號發(fā)送模版消息

    java實(shí)現(xiàn)微信公眾號發(fā)送模版消息

    這篇文章以訂單推送為例,主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信公眾號發(fā)送模版消息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 獲取JPEGImageEncoder和JPEGCode這兩個類的方法

    獲取JPEGImageEncoder和JPEGCode這兩個類的方法

    下面小編就為大家?guī)硪黄@取JPEGImageEncoder和JPEGCode這兩個類的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

开江县| 靖西县| 台东县| 滨海县| 嘉祥县| 台中市| 馆陶县| 芷江| 庆阳市| 桂林市| 周至县| 于都县| 常德市| 宿迁市| 汶川县| 平江县| 布拖县| 辛集市| 上饶县| 凤凰县| 洱源县| 华亭县| 长垣县| 桑植县| 河池市| 通山县| 项城市| 宁陕县| 扶风县| 通城县| 钟祥市| 定南县| 舞阳县| 昌江| 治多县| 八宿县| 娱乐| 墨竹工卡县| 双峰县| 阜南县| 教育|