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);
    }
}

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


版权声明:本文为weixin_43933728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。