关于枚举的用法, 备忘一下.
public enum MonitorKey {
query(A.class, "query"),
update(A.class, "update"),
...
;
Class<?> targetClazz;
String targetMehtodName;
MonitorKey() {
}
MonitorKey(Class<?> clazz, String methodName) {
this.targetClazz = clazz;
this.targetMehtodName = methodName;
}
/**
*忽略不需要埋点的调用
*
* @param invocation
* @return
*/
public boolean ignored(MethodInvocation invocation) {
Method method = invocation.getMethod();
String className = method.getDeclaringClass().getName();
return !className.equals(targetClazz.getName()) || !method.getName().equals(targetMehtodName);
}
}
在MonitorUtils中:
public static void addSuccess(MethodInvocation invocation, MonitorKey key, long duration) {
if (key.ignored(invocation)) {
return;
}
...
}
public static void addFailure(MethodInvocation invocation, MonitorKey key, long duration) {
if (key.ignored(invocation)) {
return;
}
...
}
在使用到MonitorUtils的MonitorInterceptor
public void doSuccess(MethodInvocation invocation, long duration) {
MonitorUtils.addSuccess(invocation, MonitorKey.update, duration);
}
public void doFailure(MethodInvocation invocation, long duration, Throwable e) {
MonitorUtils.addFailure(invocation, MonitorKey.update, duration);
}
这里使用枚举不是为了简单的定义一个常量, 而是将原来包含在Interceptor中的判断逻辑(在doSuccess, doFailure中均要使用相同的判断逻辑)放到枚举类型MonitorKey中, 可以将这里的枚举理解为状态模式的一种应用