查看: 3080|回复: 0

[Java语言] Spring Aop之AspectJ注解配置实现日志管理的方法

发表于 2018-3-3 12:06:35

最近项目要做一个日志功能,我用Spring Aop的注解方式来实现。

创建日志注解

  1. package com.wyj.annotation;
  2. import java.lang.annotation.Documented;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8. * 日志注解
  9. *
  10. *
  11. * @author:WangYuanJun
  12. * @date:2016年8月26日 下午8:25:35
  13. */
  14. @Target(ElementType.METHOD)
  15. @Retention(RetentionPolicy.RUNTIME)
  16. @Documented
  17. public @interface SysLog {
  18. String action() default "";//动作
  19. }
复制代码

创建切面通知类

记录操作的方法名,参数和花费的时间,使用环绕通知

  1. package com.wyj.aspect;
  2. import java.lang.reflect.Method;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.annotation.Pointcut;
  7. import org.aspectj.lang.reflect.MethodSignature;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Component;
  10. import com.wyj.annotation.SysLog;
  11. import com.wyj.entity.SysLogEntity;
  12. import com.wyj.service.SysLogService;
  13. /**
  14. * 日志切面通知
  15. *
  16. *
  17. * @author:WangYuanJun
  18. * @date:2016年8月26日 下午10:28:57
  19. */
  20. @Aspect
  21. @Component
  22. public class SysLogAspect {
  23. @Autowired
  24. private SysLogService sysLogService;
  25. /**
  26. * 切入点
  27. */
  28. @Pointcut("@annotation(com.wyj.annotation.SysLog)")
  29. public void pointCut() {}
  30. /**
  31. * 环绕通知
  32. *
  33. * @param joinPoint
  34. * @return
  35. * @throws Throwable
  36. */
  37. @Around("pointCut()")
  38. public Object aroud(ProceedingJoinPoint joinPoint) throws Throwable {
  39. // 开始时间
  40. long beginTime = System.currentTimeMillis();
  41. // 执行目标方法
  42. Object result = joinPoint.proceed();
  43. // 执行时长(毫秒)
  44. long time = System.currentTimeMillis() - beginTime;
  45. // 保存日志
  46. saveSysLog(joinPoint, time);
  47. return result;
  48. }
  49. /**
  50. * 保存日志
  51. *
  52. * @param joinPoint
  53. * @param time
  54. */
  55. private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
  56. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  57. Method method = signature.getMethod();
  58. SysLogEntity sysLogEntity = new SysLogEntity();
  59. SysLog sysLog = method.getAnnotation(SysLog.class);
  60. if (sysLog != null) {
  61. // 注解上的描述
  62. sysLogEntity.setOperation(sysLog.action());
  63. }
  64. // 获取目标类名
  65. String className = joinPoint.getTarget().getClass().getName();
  66. // 获取方法名
  67. String methodName = signature.getName();
  68. sysLogEntity.setMethod(className + "." + methodName + "()");
  69. // 请求的参数
  70. Object[] args = joinPoint.getArgs();
  71. if (args != null && args.length != 0 && args[0] != null) {
  72. sysLogEntity.setParams(args[0].toString());
  73. }
  74. sysLogEntity.setTime(time);
  75. // 保存系统日志
  76. sysLogService.save(sysLogEntity);
  77. }
  78. }
复制代码

扫描和启动aop注解

日志注解的应用

效果

以上这篇Spring Aop之AspectJ注解配置实现日志管理的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持程序员之家。



回复

使用道具 举报