Spring Aop之AspectJ注解配置实现日志管理的方法

 更新时间:2018年01月22日 14:19:51   作者:wangyuanjun008  
下面小编就为大家分享一篇Spring Aop之AspectJ注解配置实现日志管理的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

创建日志注解

package com.wyj.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 日志注解
 * 
 * 
 * @author:WangYuanJun
 * @date:2016年8月26日 下午8:25:35
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

 String action() default "";//动作

}

创建切面通知类

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

package com.wyj.aspect;

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.wyj.annotation.SysLog;
import com.wyj.entity.SysLogEntity;
import com.wyj.service.SysLogService;

/**
 * 日志切面通知
 * 
 * 
 * @author:WangYuanJun
 * @date:2016年8月26日 下午10:28:57
 */
@Aspect
@Component
public class SysLogAspect {

 @Autowired
 private SysLogService sysLogService;

 /**
  * 切入点
  */
 @Pointcut("@annotation(com.wyj.annotation.SysLog)")
 public void pointCut() {}

 /**
  * 环绕通知
  * 
  * @param joinPoint
  * @return
  * @throws Throwable
  */
 @Around("pointCut()")
 public Object aroud(ProceedingJoinPoint joinPoint) throws Throwable {

  // 开始时间
  long beginTime = System.currentTimeMillis();

  // 执行目标方法
  Object result = joinPoint.proceed();

  // 执行时长(毫秒)
  long time = System.currentTimeMillis() - beginTime;

  // 保存日志
  saveSysLog(joinPoint, time);
  return result;
 }

 /**
  * 保存日志
  * 
  * @param joinPoint
  * @param time
  */
 private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
  MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  Method method = signature.getMethod();
  SysLogEntity sysLogEntity = new SysLogEntity();
  SysLog sysLog = method.getAnnotation(SysLog.class);
  if (sysLog != null) {

   // 注解上的描述
   sysLogEntity.setOperation(sysLog.action());
  }

  // 获取目标类名
  String className = joinPoint.getTarget().getClass().getName();

  // 获取方法名
  String methodName = signature.getName();
  sysLogEntity.setMethod(className + "." + methodName + "()");

  // 请求的参数
  Object[] args = joinPoint.getArgs();
  if (args != null && args.length != 0 && args[0] != null) {
   sysLogEntity.setParams(args[0].toString());
  }
  sysLogEntity.setTime(time);

  // 保存系统日志
  sysLogService.save(sysLogEntity);
 }
}

扫描和启动aop注解

日志注解的应用

效果

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

相关文章

  • JAVA 日常开发中Websocket示例详解

    JAVA 日常开发中Websocket示例详解

    JAVA |日常开发中Websocket详解,WebSocket是一种在单个TCP连接上进行全双工通信的协议,它在Web应用中实现了客户端与服务器之间的实时数据传输,本文将详细介绍Java开发中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事项,感兴趣的朋友一起看看吧
    2024-12-12
  • System 类 和 Runtime 类的常用用法介绍

    System 类 和 Runtime 类的常用用法介绍

    这篇文章主要介绍了System 类 和 Runtime 类的常用用法,有需要的朋友可以参考一下
    2014-01-01
  • Springmvc自定义类型转换器实现步骤

    Springmvc自定义类型转换器实现步骤

    这篇文章主要介绍了Springmvc自定义类型转换器实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringCloud之Ribbon使用示例解析

    SpringCloud之Ribbon使用示例解析

    这篇文章主要为大家介绍了SpringCloud之Ribbon使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解

    SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解

    这篇文章主要介绍了SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解,因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖,如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖,需要的朋友可以参考下
    2024-01-01
  • Java中增强for循环在一维数组和二维数组中的使用方法

    Java中增强for循环在一维数组和二维数组中的使用方法

    下面小编就为大家带来一篇Java中增强for循环在一维数组和二维数组中的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java中BigDecimal比较大小的3种方法(​​compareTo()、​​equals()​​和​​compareTo()​​)

    Java中BigDecimal比较大小的3种方法(​​compareTo()、​​equals()​​和​​compar

    这篇文章主要给大家介绍了关于Java中BigDecimal比较大小的3种方法,方法分别是​​compareTo()、​​equals()​​和​​compareTo()​​,在Java中使用BigDecimal类来进行精确的数值计算,需要的朋友可以参考下
    2023-11-11
  • Java中实现日志记录的方案总结

    Java中实现日志记录的方案总结

    在平时使用到一些软件中,比如某宝或者某书,通过记录用户的行为来构建和分析用户的行为数据,这就需要使用到日志系统来存储或者记录数据,小编为大家整理了几种Java日志方案,希望对大家有所帮助
    2024-12-12
  • 浅谈java中BigDecimal的equals与compareTo的区别

    浅谈java中BigDecimal的equals与compareTo的区别

    下面小编就为大家带来一篇浅谈java中BigDecimal的equals与compareTo的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • SpringMVC中MultipartFile上传获取图片的宽度和高度详解

    SpringMVC中MultipartFile上传获取图片的宽度和高度详解

    本篇文章主要介绍了SpringMVC中MultipartFile上传获取图片的宽度和高度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论