先看效果图下面是数据库的保存操作日志:

配置文件:

工具类:
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Crm_syslog log=new GetPcUtile().getPcLog();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Crm_user user = (Crm_user) request.getSession().getAttribute("user");
boolean flag=ObjectIsNull.isEmpty(user);
if(flag==false){
log.setU_id(user.getId());
}
//方法通知前获取时间,为什么要记录这个时间呢?当然是用来计算模块执行时间的
long start = System.currentTimeMillis();
System.out.println(start+"============");
log.setLog_starttime(new Date(start));
// 拦截的实体类,就是当前正在执行的Service
Object target = pjp.getTarget();
log.setLog_nameclass(target.toString());
// 拦截的方法名称。当前正在执行的方法
String methodName = pjp.getSignature().getName();
log.setLog_namemethod(methodName);
// 拦截的方法参数
Object[] args = pjp.getArgs();
// 拦截的放参数类型
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Class[] parameterTypes = msig.getMethod().getParameterTypes();
Object object = null;
// 获得被拦截的方法
Method method = null;
try {
method = target.getClass().getMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
}
System.out.println(log.getLog_namemethod()+"=====");
if (null != method) {
// 判断是否包含自定义的注解,说明一下这里的Crm_LogAopAnnotation就是我自己自定义的注解
if (method.isAnnotationPresent(Crm_LogAopAnnotation.class)) {
Crm_LogAopAnnotation systemlog = method.getAnnotation(Crm_LogAopAnnotation.class);
System.out.println(systemlog.methods()+"==="+systemlog.module());
log.setLog_classMark(systemlog.module());
log.setLog_methodMark(systemlog.methods());
Long end = System.currentTimeMillis();
System.out.println(end+"---------------");
log.setLog_endtime(new Date(end));
Long successTime=(end-start);
log.setLog_success_time(successTime.intValue());
try {
object = pjp.proceed();
//将计算好的时间保存在实体中
log.setLog_mark("执行成功...");
System.out.println(log.getLog_mark()+"====");
logService.addLog(log);
} catch (Throwable e) {
log.setLog_mark("执行失败...");
logService.addLog(log);
}
} else {
//没有包含注解
object = pjp.proceed();
}
} else {
//不需要拦截直接执行
object = pjp.proceed();
}
return object;
}
如果你的配置文件配置了事物:改一下切入点 切Controller 按照此方法没有配置成功,请留言给我给你解决

本文介绍了一种使用AOP实现的日志拦截器设计,通过在方法执行前后记录时间,计算并记录方法执行时间,同时捕获方法的输入参数、方法名及返回结果,以实现对业务操作的全面监控。
1552

被折叠的 条评论
为什么被折叠?



