【SSM】基于AOP自定义注解实现操作日志
- 导入aop依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
- 自定义注解
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface OperationAnnotation {
String action() default "";
}
- 基于AOP切面切点
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Aspect
@Component
@EnableAsync
public class LogAspect {
private String id;
private String path;
private String time;
private String parameter;
private String title;
private String action;
@Resource
private LogAopService logAopService;
@Pointcut("@annotation(aop_log.OperationAnnotation)")
public void logPointCut(){
}
@Before("logPointCut()")
public void setUUId(){
this.id=UUID.randomUUID().toString();
}
@After("logPointCut()")
public void setAction(JoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperationAnnotation annotation = method.getAnnotation(OperationAnnotation.class);
this.action= annotation.action();
}
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 Integer || paramValues[i] instanceof String){
param.put(paramNames[i], paramValues[i]);
}
}
return param;
}
@Before("logPointCut()")
public void setPath(JoinPoint joinPoint) {
Class<?> targetClass = joinPoint.getTarget().getClass();
RequestMapping requestMapping=targetClass.getAnnotation(RequestMapping.class);
if (requestMapping != null){
this.path=requestMapping.value()[0];
}
}
@After("logPointCut()")
public void save(){
LogAop logAop=new LogAop(id, path, time, parameter, title, action);
logAopService.insert(logAop);
System.out.println(logAop);
}
}
- 创建实体类,存入操作日志的对应字段变量
@Data
@ToString
@AllArgsConstructor
public class LogAop {
private String id;
private String path;
private String time;
private String parameter;
private String title;
private String action;
}
- 在方法上使用自定义注解
@RestController
public class LogAopController {
@OperationAnnotation(action = "注解参数内容")
public RespResult findList(){
return RespResult.success();
}
}