方面可用于衡量方法调用的性能, 如下例所示:
public aspect MonitorRequests {
void around() : monitoredRequestO {
PerfStats stats = getPerfStats(thisDoinPointStaticPart);
long start = System-currentTimeMillisO;
proceedO;
stats.ecunter++;
stats.time += System.currentTimeMillisC)-start;
}
pointcut monitoredRequestO :
execution(void HttpServ1et.do*(..)) && if(enabled);
// can expose stats via JMX, dump method, getstats etc.
public static class PerfStats { _. }
private Map<StaticPart,PerfStats> perfStatMap • //...
private boolean enabled;
}
默认情况下,方面实例与Java虚拟机关联,而不是与
特定的执行流程,类似于静态类。
下面的另一个方面是使用percflow()
以不同方式关联方面实例
默认值:
public aspect MonitorDatabaseRequests
percflow(monitoredRequest() && !cflowbelow(mon-5toredRequest()) {
void around() : monitoredRequestO {
PerfStats stats = getPerfStats(thisJoinPointStaticPart);
long time.= System.currentTimeMi 11 i s O ;
proceed();
stats.counter++;
stats.databaseTime += accumulatedoatabaseTime;
stats.time 4= System.currentTimeMi 11 isO-time;
}
}
在此示例中添加percflow()声明有什么区别
我很困惑percflow的工作原理以及它与不使用它的方式有何不同....
答案 0 :(得分:0)
percflow
是方面实例化模型。看这里:
http://eclipse.org/aspectj/doc/released/progguide/quick-aspectAssociations.html
这意味着为每个输入的cflow创建了此方面的一个实例。
第一个方面是单身,所以它必须存储它所跟踪的所有表现统计数据的地图。第二个方面根据需要进行实例化,因此性能统计信息被隐式存储并与正确的动态调用图关联。