Spring Boot的AOP增强
-
在pom文件中添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
在@Component @Aspect添加两个注解
-
具体编写的类如下
@Component//交给spring管理
@Aspect//声明为切面,上面这两个是必学的
@Slf4j//lombok的注解
public class LoggerAspect {
//为长的execution表达式取一个简短的名称,其中*要注意换成自己的包,*代表所有
@Pointcut("execution(* com.*.*.controller.*.*(..))")
public void pointCut(){
}
//前置通知,目标方法调用前被调用
@Before("pointCut()")//这里的pointCut()相当于execution(* com.*.*.controller.*.*(..))
public void beforeAdviceMethod(JoinPoint joinPoint){
log.info("===========前置通知开始 =================");
Object target = joinPoint.getTarget();
Signature signature = joinPoint.getSignature();
log.info("获取目标方法所在的类:" + target);
log.info("返回目标方法的签名:" + signature);
log.info("代理的是哪一个方法:" + signature.getName());
Object[] args = joinPoint.getArgs();
log.info("获取目标方法的参数信息:" + Arrays.asList(args));
log.info("=========== 前置通知结束 =================");
}
/*
* 环绕方法,会在方法最前面执行增强的方法,最后执行被增强的方法
* */
@Around("pointCut()")
public Object aroundAdviceMethod(ProceedingJoinPoint proceedingJoinPoint){
//log.info("=======环绕增强开始=======");
long startTime = System.currentTimeMillis();
Object target = proceedingJoinPoint.getTarget();
Signature signature = proceedingJoinPoint.getSignature();
Object[] args = proceedingJoinPoint.getArgs();
log.info("当前的类是:" + target);
log.info("当前的类是:加强版本:" + target.getClass().getCanonicalName());
log.info("当前的类是:简写版本:" + target.getClass().getSimpleName());
log.info("当前的方法是:" + signature);
log.info("被增强方法的参数:" + Arrays.asList(args));
//使用lambda表达式,在日志中打印参数的信息
Arrays.stream(args).forEach(arg -> log.info("arg is {}", arg));
// 获取相应
try {
//log.info("环绕增强调用被增强的方法before");
//调用被增强的方法, ==分界点==
Object proceed = proceedingJoinPoint.proceed();
//log.info("环绕增强调用被增强的方法after");
//需要返回上面的结果,类似拦截器的放行,也类似于调用原方法,没有这个返回被加强的方法会无法访问
return proceed;//这里不能返回null,否则会报错
} catch (Throwable throwable) {
throwable.printStackTrace();
}finally {
long endTime = System.currentTimeMillis();
//日志中可以使用{}进行占位,类似于c++
log.info("请求:{}, 耗时{}ms", proceedingJoinPoint.getSignature(), (endTime - startTime));
//log.info("=======环绕增强结束=======");
}
return null;
}
}