Java面试题储备14: 使用aop实现全局日志打印
-
引入依赖
<!-- aop --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.6.6</version> </dependency>
-
切面代码
@Aspect
@Component
@Slf4j
@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
public class UmpMonitorAspect {private static String UMP_APP_NAME = "super-applet";/*** 需要拦截的*/@Pointcut("execution(public * com.a..*.*(..)) ")public void include() {}/*** 不需要拦截的 */@Pointcut("execution(public * com.b.*.start..*(..))")public void exclude() {}/*** 切面*/@Pointcut("exclude() && !include() ||\n")public void checkAlarmAnnotation() {}@Around(value = "checkAlarmAnnotation()")public Object umpMonitorRecorder(ProceedingJoinPoint joinPoint) throws Throwable {String packageName = joinPoint.getSignature().getDeclaringTypeName();String methodName = joinPoint.getSignature().getName();String key =packageName + CommonConstants.DOT + methodName;CallerInfo info = Profiler.registerInfo(key);try {// log.debug("ump注解形式开启,key:{},umpAppName:{}", key, UMP_APP_NAME);return joinPoint.proceed();} catch (Throwable throwable) {Profiler.functionError(info);throw throwable;} finally {Profiler.registerInfoEnd(info);}}
}
通过注解
@Pointcut("execution(public * com.a….(…)) ")
切入点,后面复制需要切入的包的路径,比如此时就是要拦截所有包a下的数据请求
@Before(“com.a.controller.") - 打印接口入参
@After("com.a.controller.”) - 打印接口出参
@Around(value = “checkAlarmAnnotation()”) - 环绕通知