AspectJ - 怀疑

时间:2011-06-16 06:32:06

标签: aop aspectj

方面可用于衡量方法调用的性能, 如下例所示:

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的工作原理以及它与不使用它的方式有何不同....

1 个答案:

答案 0 :(得分:0)

percflow是方面实例化模型。看这里: http://eclipse.org/aspectj/doc/released/progguide/quick-aspectAssociations.html

这意味着为每个输入的cflow创建了此方面的一个实例。

第一个方面是单身,所以它必须存储它所跟踪的所有表现统计数据的地图。第二个方面根据需要进行实例化,因此性能统计信息被隐式存储并与正确的动态调用图关联。