原因是:引用了@RefreshScope注解导致AOP环绕通知执行Around执行2次
1. 问题代码
@RefreshScope
@Aspect
@Component
public class ControllerAspect {
private final Logger logger = LogManager.getLogger(this.getClass());
@Value("${warnTime:500}")
private Long warnTime;
/**
* 切面定义,拦截所有Controller的所有方法
*/
@Pointcut("execution(* com.zhi..*Controller.*(..))")
private void controller() {
}
@Around("controller()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("环绕通知开始");
try {
return joinPoint.proceed();
} finally {
logger.info("环绕通知结束");
}
}
}
说明:@RefreshScope配合@Value注解用于动态获取注册中心中的配置
2、日志输出结果,被拦截的方法只执行了一次,但环绕通知中的方法却执行了2次:
3、去掉RefreshScope注解后的日志输出:
说明:如果没有使用配置中心,单使用RefreshScope注解也不会出现日志输出2次的问题。
4、问题猜测
应该使用RefreshScope注解后ControllerAspect被再次代理,结合@Component总共被代理了2次。