文章目录
  1. 1. 一、需求与思考
  2. 2. 二、实际操作

一、需求与思考

背景:前一阵因为需求变更,在一些方法上添加了统一监控的代码,基本上是采用try/catch/finally在不影响原有代码逻辑的情况下添加,其结果就是项目中出现了大量的重复代码。
思考:重复代码向来是优化工作中需要尽可能干掉的部分,此外想到今后还有可能对其他方法加/去监控,再写try/catch显得很不灵活,所以得想办法改善这一情况。
方法:想到使用注解。注解的增删极其简单方便,然而之前并没有真正使用过自定义注解,在学习时也只是写过取注解中属性和反射相关的小demo,想要实现改良,需要将注解结合AOP动态代理使用。

二、实际操作

定义注解

  • 定义一个名为@AddUMP的注解
1
2
3
4
5
6
7
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddUMP {
String methodName();
boolean enableHeartBeat() default false;
boolean enableTP() default true;
}

配置切点

  • 切点限定(execution表达式)
  • 在原有逻辑前后加上异常检测
  • ProceedingJoinPoint调用proceed方法执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Component
@Aspect
public class UMPMonitor {
private static final Logger log = LoggerFactory.getLogger(UMPMonitor.class);
//关键:切面设置为针对@addUMP注解
@Around(value = "@annotation(addUMP)")
//返回值为Object类型,参数传入注解(不用再写反射)
public Object aroundMethod(ProceedingJoinPoint pjd, AddUMP addUMP) {
//获取注解中的信息
String methodName = addUMP.methodName();
boolean enableHeartBeat = addUMP.enableHeartBeat();
boolean enableTP = addUMP.enableTP();
CallerInfo callerInfo = null;
Object result;
BaseResponseVo responseVo = new BaseResponseVo();
try {
callerInfo = Profiler.registerInfo(methodName, enableHeartBeat, enableTP);
//执行原有逻辑
result = pjd.proceed();
} catch (Throwable e) {
Profiler.functionError(callerInfo);
log.error("UMP捕获到错误:" + e);
responseVo.setErrorCode("");
responseVo.setErrStrSet(null);
responseVo.setIsSuccess(false);
responseVo.setMessage(e.getMessage());
result = responseVo;
}finally {
Profiler.registerInfoEnd(callerInfo);
}
return result;
}
}

给方法添加注解

  • 在所需要添加切面的方法上标记@AddUMP即可
文章目录
  1. 1. 一、需求与思考
  2. 2. 二、实际操作