先看效果图下面是数据库的保存操作日志:
配置文件:
工具类:
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 按照此方法没有配置成功,请留言给我给你解决