首页 > 开发 > Java > 正文

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

2024-07-13 10:17:08
字体:
来源:转载
供稿:网友

最近项目要做一个日志功能,我用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)@Documentedpublic @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@Componentpublic 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,注解配置,日志管理

日志注解的应用

Spring,Aop,AspectJ,注解配置,日志管理

效果

Spring,Aop,AspectJ,注解配置,日志管理

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


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表