第一步引入必要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
第二步创建自定义日志注解类
package com.example.aop.log.annotion;
import java.lang.annotation.*;
@Inherited
@Target({ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface LogNotice {}
第三步切面设计,扫描上面的注解
package com.example.aop.log.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.example.aop.log.annotion.LogNotice)")
public void doLog() {}
@Around("doLog()")
public Object insertLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object object = joinPoint.proceed();
try {
HashMap paramsMap;
Signature signature = joinPoint.getSignature();
Method method = ((MethodSignature) signature).getMethod();
String methodName = method.getName();
String className = method.getDeclaringClass().getName();
paramsMap = (HashMap) getParams(joinPoint, method);
// 打印日志,可以记录到数据库的日志表里面,等到有客户反馈的时候好去查询日志
System.out.println(
"methodName: " + methodName + "; className: " + className + "; paramsMap:" + paramsMap);
// 也可以记录请求当前接口耗费的时间
} catch (Exception e) {
// 如果在日志记录的过程中出现问题,那么要处理一下异常,不要直接抛出,此处做成消息队列通知或者打印日志
}
// 此处要进行返回代理的对象,如果没有返回的话,前端是收不到数据的
return object;
}
private Map<String, Object> getParams(ProceedingJoinPoint joinPoint, Method method) {
// get parameter names
String[] parameterNames = new DefaultParameterNameDiscoverer().getParameterNames(method);
Object[] args = joinPoint.getArgs();
Map<String, Object> params = new HashMap<>(8);
if (parameterNames != null && parameterNames.length != 0) {
for (int i = 0; i < parameterNames.length; i++) {
params.put(parameterNames[i], args[i]);
}
return params;
}
第四步把自定义的注解放到你的接口上面
package com.example.demo.controller;
import com.example.aop.log.annotion.LogNotice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/person")
public class PersonController {
//在此处加上你自定义的注解(@LogNotice)
@LogNotice
@GetMapping("get_person")
public String getPerson(Integer numbers) {
return "123";
}
}
第五步测试
到此这篇关于SpringAOP实现日志收集管理功能的文章就介绍到这了,更多相关SpringAOP日志收集管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!