pom.xml配置文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
自定义注解OperationAnnotation
package com.shengun.annotation;
import java.lang.annotation.*;
/**
* 自定义一个注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface OperationAnnotation {
String content() default ""; //内容
//
// int sysType() default 0; //系统平台
//
// int opType() default 0;//操作类型
//
// String action() default "";//功能名称
}
编写一个切面SystemLogAspect
package com.shengun.aspect;
import com.shengun.annotation.OperationAnnotation;
import com.sun.deploy.net.HttpResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.CodeSignature;
import org.springframework.http.HttpRequest;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
public class SystemLogAspect {
//这里有操作数据库mapper,简写
private long startTime = 0;
private long endTime = 0;
private HttpServletRequest request = null;
@Pointcut("@annotation(com.shengun.annotation.OperationAnnotation)")
public void logPointCut(){ }
/**
* 前置通知
*/
@Before(value = "logPointCut()")
public void before(JoinPoint joinPoint){
startTime = System.currentTimeMillis();
}
/**
* 后置通知
*/
@After(value = "logPointCut()")
public void after(JoinPoint joinPoint){
request = getHttpServletRequest();
System.out.println(request.getQueryString());
System.out.println("请求方式:(GET | POST)" + request.getMethod());
System.out.println("###### request:" + request.toString());
//获取类名
String targetName = joinPoint.getTarget().getClass().getName(); //com.shengun.quartz.controller.SysJobController
System.out.println("目标类的全路径:" + targetName);
//获取方法名
String methodName = joinPoint.getSignature().getName(); //sysJobList
System.out.println("注解的方法:" + methodName);
// 目标类的class对象
Class<?> targetClass = null;
try {
targetClass = Class.forName(targetName);
} catch (Exception e) {
e.printStackTrace();
}
//得到所有方法
Method[] methods = targetClass.getMethods();
for (Method method : methods) {
//找到方法了 循环变量方法
if(method.getName().equals(methodName)){
System.out.println(method.getAnnotations());
// 判断是否有OperationAnnotation 注解
System.out.println(method.getAnnotation(OperationAnnotation.class));
//获取注解中的内容
String content = method.getAnnotation(OperationAnnotation.class).content();
System.out.println("###注解中的内容:" + content);
String s = getNameAndValue(joinPoint).toString();
System.out.println("入参参数:" + s);
break;
}
}
endTime = System.currentTimeMillis();
System.out.println("endTime:" + endTime);
}
/**
* @param joinPoint
* @Description 获取入参方法参数
* @return
*/
public Map<String, Object> getNameAndValue(JoinPoint joinPoint) {
Map<String, Object> param = new HashMap<>();
Object[] paramValues = joinPoint.getArgs();
String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
for (int i = 0; i < paramNames.length; i++) {
if (paramValues[i] instanceof BindingResult
|| paramValues[i] instanceof HttpRequest
|| paramValues[i] instanceof HttpResponse){
continue;
}
param.put(paramNames[i], paramValues[i]);
}
return param;
}
/**
* @Description: 获取request
*/
public HttpServletRequest getHttpServletRequest(){
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes)ra;
HttpServletRequest request = sra.getRequest();
return request;
}
/**
* 环绕通知
*/
// @Around(value = "logPointCut()")
public Object around(){
System.out.println("环绕通知");
return null;
}
public void throwing(){
System.out.println("异常通知");
}
}
使用图