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);
}
}
按需修改后,控制台打印信息。