注解及aop使用

依赖

 <!--aspoct-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

自定义注解


import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperLog {
    /**
     *  介绍
     */
    String title();
    /**
     * 日志类型
     */
    String operation();
}

切面


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
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.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

@Aspect
@Component
public class SysLogAspect {

    /**
     * 定义切点 @Pointcut
     * 在注解的位置切入代码
     */
    @Pointcut("@annotation(com.dxy.demo_05_08.annotation.OperLog)")
    public void logPointCut() {
    }

    /**
     * 环绕通知,获取接口调用前后入参及返回值数据
     * @param proceedingJoinPoint
     * @return
     */
    @Around("logPointCut()")
    public Object saveSysLog(ProceedingJoinPoint proceedingJoinPoint) {
        try {
            //保存日志
            //从切面织入点处通过反射机制获取织入点处的方法
            MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
            //获取切入点所在的方法
            Method method = signature.getMethod();
            //获取操作
            OperLog myLog = method.getAnnotation(OperLog.class);
            if (myLog != null) {
                System.out.println(myLog.title()+","+myLog.operation());
            }
            //获取请求的类名
            String className = proceedingJoinPoint.getTarget().getClass().getName();
            //获取请求的方法名
            String methodName = method.getName();
            System.out.println(className + "." + methodName+"()");

            //请求的参数
            Object[] args = proceedingJoinPoint.getArgs();
            System.out.println(args[0]);
            //将参数所在的数组转换成json
            String params = JSON.toJSONString(args);
            JSONArray jsonArray = JSON.parseArray(params);
          /*  operLog.setOperParam(params);
            UserInfo user = JSON.toJavaObject(jsonArray.getJSONObject(0),UserInfo.class);
            operLog.setOperName(user != null ? user.getUserName() != null ? user.getUserName() : user.getMobile() : "");
            operLog.setOperTime(new Date());*/
            //获取用户名
            //获取用户ip地址
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
           // request.setAttribute("user","tom");
            Object user = request.getAttribute("user");
            // 记录下请求内容
      /*      operLog.setOperIp(IpUtils.getIpAddr(request));
            operLog.setOperUrl(request.getRequestURI());*/
            //调用service保存SysLog实体类到数据库
            // 异步保存日志数据到数据库
            //AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
            Object result = proceedingJoinPoint.proceed();
            System.out.println(result);
            return result;
        } catch (Throwable e) {

        }
        return "";

    }
}

controller

 /**
     * @return
     */
    @OperLog(title = "账号密码登陆",operation="查询")
    @RequestMapping(path = "/hello", method = {RequestMethod.GET, RequestMethod.POST})
    public @ResponseBody
    Object adduser(@RequestParam(defaultValue ="username") String t) {
        return "hello";
    }

截图

在这里插入图片描述

参考文章

https://www.jianshu.com/p/c2ae8a23f937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值