日志切面
首先定义一个切面,用于获取连接点的方法,对获取到的代理类进行日志处理。
package com.huan.aop;
import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Component;
/** 定义一个切面
* @create 2021-09-24-13:45
*/
@Slf4j
@Aspect
@Component
public class LogAspect {
//Pointcut定义切入点表达式,表达式中要描述在那些地方定义切入点
@Pointcut("@annotation(com.huan.aop.RequiredLog)")
public void doLog(){} //这里什么都不写
/**定义扩展业务逻辑
* 在执行的切入点方法上执行@Around注解描述的方法*/
//@Around("@annotation(com.huan.aop.RequiredLog)")
@Around("doLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("Before {}",System.currentTimeMillis());
Object result = joinPoint.proceed(); //执行执行链(其它切面,目标方法-锦)
log.info("After {}",System.currentTimeMillis());
return result; //目标方法(切入点方法)的执行结果
}
}
其中:
joinPoint:连接点,添加Aop日志的方法
joinPoint.getSignature():获取连接点的方法签名
joinPoint.proceed():运行切入点的方法体内容
logAnn:切入点标记注解
标记注解
切入点用一个注解来标记:
package com.huan.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**自定义注解,通过此注解描述需要执行扩展业务逻辑的方法,就是标识
* @create 2021-09-24-13:42
*/
@Retention(RetentionPolicy.RUNTIME) //什么时候有效 运行时
@Target(ElementType.METHOD) //定义描述的类型为 方法
public @interface RequiredLog {
String value() default "";
}
添加自定义注解
在需要使用添加日志的业务方法处,添加一个@RequiredLog注解即可添加Aop通知。
如以下在我自己的业务代码中!
.......
@RequiredLog(module = "文件上传") //joinPoint.proceed()调进来
@PostMapping("/upload")
public String uploadFile(MultipartFile uploadFile) throws IOException {
..........
}