1.指定切面类:一般通过注解进行
2.指定切点:
3.监听
创造切点
@Retention(RetentionPolicy.RUNTIME) // 指定运行时
@Target({ElementType.METHOD})// 可以加在方法上
public @interface SystemLog {
// 可以向注解里面传递参数 例如 :businessName = “更新用户信息”
String businessName() ;
}
【spring|springAOP 通过注解实现 日志打印】RetentionPolicy:源码
文章图片
指定切面类 HttpServletRequest的使用方法
@Component
@Aspect // 标记是切面类
@Slf4j
public class LogAspect {// 确定切点 , 加上 @SystemLog注解的全部是切点
@Pointcut("@annotation(com.sangeng.annotation.SystemLog)")
public void pt(){}//环绕通知 ,在之前之后 都会打印
// ProceedingJoinPoint :获取目标 **方法** 的信息
@Around("pt()")
public void printLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object ret;
try {
// 运行之前打印信息
handleBefore(joinPoint) ;
// joinPoint.proceed(): 获取对应方法的返回结果
Object proceed = joinPoint.proceed();
// 运行之后打印信息
handleAfter(proceed) ;
}finally {
log.info("--------END---------"+System.lineSeparator());
}}private void handleAfter(Object ret) {
log.info("Response: {}",JSON.toJSONString(ret));
}
// ProceedingJoinPoint 是一个接口 !!
private void handleBefore(ProceedingJoinPoint joinPoint) {// 获取requet从request中获取 request.getRequestURL() ,RequestContextHolder是保存在本地线程之中的 threadlocal
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
//
SystemLog systemLog = getSystemLog(joinPoint) ;
log.info("=======Start=======");
// 打印请求 URL
log.info("URL: {}",request.getRequestURL());
// 打印描述信息
log.info("BusinessName: {}",systemLog.businessName() );
// 打印 Http method
log.info("HTTP Method: {}", request.getMethod());
// joinPoint 打印调用 controller 的全路径以及执行方法
log.info("Class Method: {}.{}", joinPoint.getSignature().getDeclaringTypeName(),
((MethodSignature) joinPoint.getSignature()).getName());
// 打印请求的 IP
log.info("IP: {}",request.getRemoteHost());
// joinPoint 打印请求入参
log.info("Request Args: {}", JSON.toJSONString(joinPoint.getArgs()));
// 打印出参
// 结束后换行 System.lineSeparator():系统的换行符linux 和windows的不一样
log.info("=======End=======" + System.lineSeparator());
}//获取注解信息
private SystemLog getSystemLog(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
return signature.getMethod().getAnnotation(SystemLog.class);
}
}
ProceedingJoinPoint 实现类的 源码
文章图片
推荐阅读
- java|java基础巩固16
- 抖音|java 抖音开放平台 code token等
- 抖音开发|抖音开放平台入门教程之获取抖音授权,根据授权换取token,根据token调用接口示例!
- java|抖音开放平台, 企业号私信订阅服务 java(公开的)
- 面试|秋招已至,抓紧备一波蚂蚁金服、字节跳动、阿里等大厂面试,冲刺金九银十!!
- java|Java开发四年遇瓶颈,决心跳槽入字节,四面后成功斩获45万offer!!
- java|(Java岗面试)耗时1月最新整理了20个技术栈的大厂面试题+解析+面经!
- java|盘它!分布式+框架+微服务+性能优化等,一篇拿下架构大全!
- windows|NSSM - 将任何exe应用封装成windows服务的神器