SpringBoot自定义注解之实现AOP切面日志详解
作者:你是我的小丫小太阳 时间:2022-12-18 17:58:06
通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),在 SpringBoot 中来实现 AOP 切面统一打印出入参日志。
一、先看下项目结构
二、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 "";
/**
* 操作内容
* **/
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 {
// 切入点
@Pointcut(value = "@annotation(com.zxk.demo.annotation.SysLog)")
private void pointcut() {
}
/**
* 在方法执行前
* @param point
* @param myLog
* @return
*/
@Before(value = "pointcut() && @annotation(sysLog)")
public void before(SysLog sysLog){
System.out.println("++++执行了before方法++++");
}
/**
* 在方法执行前后
* @param point
* @param myLog
* @return
*/
@Around(value = "pointcut() && @annotation(sysLog)")
public Object around(ProceedingJoinPoint point, SysLog sysLog) {
System.out.println("++++执行了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("执行了类:" + clazz.getSimpleName());
System.out.println("方法:" + currentMethod.getName());
System.out.println("自定义注解:" + obj+"==="+text);
} catch (Exception e) {
e.printStackTrace();
}
try {
return point.proceed(); // 执行程序
} catch (Throwable throwable) {
throwable.printStackTrace();
return throwable.getMessage();
}
}
/**
* 方法执行后
* @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();
/**
* 将信息保存到数据库
* **/
System.out.println("++++执行了afterReturning方法++++");
System.out.println("自定义注解:" + sysLog.obj()+"=="+sysLog.text());
System.out.println("执行结果:" + result);
return result;
}
/**
* 方法执行后 并抛出异常
* @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("++++执行了afterThrowing方法++++");
System.out.println("请求:" + sysLog.text() + " 出现异常");
}
}
五、Controller层实现
@SysLog(obj = "操作对象", text = "操作内容")
@GetMapping("/index")
public String hello() {
// int num = 5/0;
// System.out.println("执行结果:" + num);
return "hello word";
}
六、测试
来源:https://blog.csdn.net/qq_40083897/article/details/105831925
标签:SpringBoot,AOP,日志
0
投稿
猜你喜欢
C#微信公众平台开发之access_token的获取存储与更新
2023-12-16 06:12:04
关于jdk环境变量的配置方式解读
2023-04-22 14:53:05
Java利用反射对list对象做过滤
2023-12-23 07:39:17
浅谈Android串口通讯SerialPort原理
2023-03-31 12:39:52
Android 消息机制问题总结
2023-08-06 03:10:49
Unity UI实现循环播放序列图
2023-03-14 15:51:10
Springboot整合Shiro的代码实例
2021-09-03 04:16:52
Flutter Android多窗口方案落地实战
2023-01-30 04:55:07
SpringBoot 过滤器 Filter使用实例详解
2021-11-08 13:46:00
使用SpringBoot+OkHttp+fastjson实现Github的OAuth第三方登录
2023-03-18 01:27:34
C# 字符串、数组和List的截取和转换实例
2022-12-16 23:06:38
java计算两点间的距离方法总结
2023-12-21 17:32:45
Java启用Azure Linux虚拟机诊断设置
2022-06-28 05:42:51
Android自定义图片集合
2022-06-24 11:34:52
Java 比较接口comparable与comparator区别解析
2022-11-26 20:54:24
SpringBoot中@ConfigurationProperties 配置绑定
2023-04-07 04:02:57
Flutter仿网易实现广告卡片3D翻转效果
2021-07-23 22:38:05
Java字符串查找的三种方式
2023-11-18 22:00:30
java判断某个点是否在所画多边形/圆形内
2022-09-30 23:50:45
基于Fedora14下自带jdk1.6版本 安装jdk1.7不识别的解决方法
2022-05-17 19:27:39