springboot AOP 自定义注解

AOP的作用之一,简化代码,减少代码冗余,保证代码唯一性,便于维护。

1、自定义注解LogAnnotate

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotate {
    String value() default "";
}

2、切面LogAspect

@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    @Resource
    private LogFeign logFeign;

    @Pointcut("@annotation(com.fu.ums.aop.LogAnnotate)")
    public void logOperation() {}

    /**
     * 切点之前执行
     */
    @Before("logOperation()")
    public void doBefore(JoinPoint point) throws JsonProcessingException {
        //开始打印日志
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //获取自定义注解的信息
        logger.info("====================================================");
        logger.info("URL:{}",request.getRequestURL().toString());
        logger.info("HTTP Method:{}",request.getMethod());
        logger.info("Class Method:{}.{}",point.getSignature().getDeclaringTypeName(),point.getSignature().getName());
        logger.info("IP:{}",request.getRemoteAddr());
        logger.info("Request Args:{}",new ObjectMapper().writeValueAsString(point.getArgs()));
    }

    /**
     * 切点之后执行
     */
    @After("logOperation()")
    public void  doAfter(){
        logger.info("====================================================");
    }

    /**
     * 抛出异常时执行
     */
    @AfterThrowing("logOperation()")
    public void afterThrowing(JoinPoint point){
    	logger.info("切点异常");
    }

    /**
     * 环绕是最后执行的
     */
    @Around("logOperation()&&@annotation(logAnnotate)")
    public Object doAround(ProceedingJoinPoint point, LogAnnotate logAnnotate) throws Throwable{
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Object result = point.proceed();//执行切点
        logger.info("Response Args:{}",new ObjectMapper().writeValueAsString(result));//打印参数
        logger.info("LogAOP param value:{}", logAnnotate.value());
        return result;
    }
}

3、Controller层使用接口

@RestController
public class LoginController {
    @Resource
    UserMapper userMapper;
    @Resource
    RedisUtils redisUtils;

    @PostMapping("login")
    @LogAnnotate("登录接口")
    public Result login(@RequestParam String userName, @RequestParam String password) throws JsonProcessingException {
        User user = userMapper.check(userName, DigestUtils.md5DigestAsHex(password.getBytes()));
        if (user==null) return new Result("账号或密码错误");
        String uuid = UUID.randomUUID().toString();
        redisUtils.set(uuid, new ObjectMapper().writeValueAsString(user),1800);
        return new Result(true,uuid);
    }
}

按需修改后,控制台打印信息。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值