美文网首页
在springboot项目中,使用aop来保存操作日志

在springboot项目中,使用aop来保存操作日志

作者: momdiemg | 来源:发表于2019-11-25 14:08 被阅读0次

    以日志实体类和dao,service方法准备好为前提

    引入依赖

    <!--spring切面aop依赖-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    新建annotation类

    @Target({METHOD, TYPE})//作用在参数和方法上
    @Retention(RetentionPolicy.RUNTIME)//运行时注解
    @Inherited
    @Documented//表明这个注解应该被 javadoc工具记录
    public @interface Operation {
        String value() default "";
    }
    

    新建LogAspect切面类

    import cn.hutool.system.SystemUtil;
    import com.springboot.demo.entity.SysLog;
    import com.springboot.demo.service.ISysLogService;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    import javax.annotation.Resource;
    import java.lang.reflect.Method;
    /**
     * Create By SINYA
     * Description:
     */
    @Aspect
    @Component
    public class SysAspect {
    
        @Resource
        private ISysLogService sysLogService;
    
        //定义切点 @Pointcut
        //在注解的位置切入代码
        @Pointcut("@annotation(com.springboot.demo.core.interceptor.aop.Operation)")
        public void logPointCut(){
        }
    
        @AfterReturning(value="logPointCut()",returning="returnValue")//returning表示这个方法返回的值
        public void saveSysLog(JoinPoint joinPoint,Object returnValue) {
            //保存日志
            SysLog sysLog = new SysLog();
    
            //从切面织入点处通过反射机制获取织入点处的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //获取切入点所在的方法
            Method method = signature.getMethod();
    
    
            //获取操作
            Operation operation = method.getAnnotation(Operation.class);
            if (operation != null) {
                String value = operation.value();
                sysLog.setRequestDesc(value);//保存获取的操作
            }
    
            //获取请求的类名
            String className = joinPoint.getTarget().getClass().getName();
            //获取请求的方法名
            String methodName = method.getName();
    
            //注入Syslog对象
            //username应从session里取出
            sysLog.setUserName("Sinya");
            
            //IP地址获取工具为HUtooljar包,自行添加依赖
            sysLog.setUserIp(SystemUtil.getHostInfo().getAddress());
            sysLog.setRequestMethod(className + "." + methodName);
    
            //调用service保存SysLog实体类到数据库
            sysLogService.saveLog(sysLog);
        }
    
    }
    
    
    
    如果日志需要参数里,和返回结果的一些数据,那么可以通过下面的方法获取请求参数,以及使用上面的retuning变量来获取日志想要的值来给日志对象增加属性
    20191125-135831.jpg

    给想要增强的方法添加注解即可


    20191125-140228.jpg

    参考https://www.jianshu.com/p/6701ad2c6f82比较详细

    相关文章

      网友评论

          本文标题:在springboot项目中,使用aop来保存操作日志

          本文链接:https://www.haomeiwen.com/subject/rdodwctx.html