一 了解Aop的概念
1.连接点
在目标类中能够插入切面的一个点。
2.切点
一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。
切点其实是定义了需要在哪些连接点上执行通知。
3.通知
切面的工作被称为通知,通知定义了切面是什么以及何时使用。
降低了描述切面要完成的工作,通知还姐姐了何时执行这个而工作的问题,5种通知类型。
4.切面
切面是通知和切点的结合,通知和切点共同定义了切面的全部内容。定义是什么,在何时和何处完成其功能。
二 案例
2.1 连接点
将其应用至所有需要加上 日志记录 的模块对应的Controller的操作方法上!!
2.2 切面,切点,通知
//保存日志
private void saveLog(ProceedingJoinPoint point,Long time){
MethodSignature signature= (MethodSignature) point.getSignature();
Method method=signature.getMethod();
SysLogEntity logEntity=new SysLogEntity();
//获取请求操作的描述信息
LogAnnotation logAnnotation=method.getAnnotation(LogAnnotation.class);
if (logAnnotation!=null){
logEntity.setOperation(logAnnotation.value());
}
//获取操作方法名
String className=point.getTarget().getClass().getName();
String methodName=signature.getName();
logEntity.setMethod(new StringBuilder(className).append(".").append(methodName).append("()").toString());
//获取请求参数
Object[] args=point.getArgs();
String params=new Gson().toJson(args[0]);
logEntity.setParams(params);
//获取ip
logEntity.setIp(IPUtil.getIpAddr(HttpContextUtils.getHttpServletRequest()));
//获取剩下的参数
logEntity.setCreateDate(DateTime.now().toDate());
String userName=ShiroUtil.getUserEntity().getUsername();
logEntity.setUsername(userName);
//执行时间
logEntity.setTime(time);
sysLogService.save(logEntity);
}
}
2.3 注解
package com.debug.pmp.server.annotation;
import java.lang.annotation.*;
/**
* Created by Administrator on 2019/8/5.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
String value() default "";
}
三 日志管理
3.1 查询列表
//保存日志
private void saveLog(ProceedingJoinPoint point,Long time){
MethodSignature signature= (MethodSignature) point.getSignature();
Method method=signature.getMethod();
SysLogEntity logEntity=new SysLogEntity();
//获取请求操作的描述信息
LogAnnotation logAnnotation=method.getAnnotation(LogAnnotation.class);
if (logAnnotation!=null){
logEntity.setOperation(logAnnotation.value());
}
//获取操作方法名
String className=point.getTarget().getClass().getName();
String methodName=signature.getName();
logEntity.setMethod(new StringBuilder(className).append(".").append(methodName).append("()").toString());
//获取请求参数
Object[] args=point.getArgs();
String params=new Gson().toJson(args[0]);
logEntity.setParams(params);
//获取ip
logEntity.setIp(IPUtil.getIpAddr(HttpContextUtils.getHttpServletRequest()));
//获取剩下的参数
logEntity.setCreateDate(DateTime.now().toDate());
String userName=ShiroUtil.getUserEntity().getUsername();
logEntity.setUsername(userName);
//执行时间
logEntity.setTime(time);
sysLogService.save(logEntity);
}
}
3.2 清除日志
//清除
@ResponseBody
@RequestMapping("/truncate")
@RequiresPermissions("sys:log:truncate")
public BaseResponse truncate(){
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
sysLogService.truncate();
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}