首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录Springframework中的方法所用的时间?

如何记录Springframework中的方法所用的时间?
EN

Stack Overflow用户
提问于 2009-09-30 05:08:41
回答 5查看 12.3K关注 0票数 9

在springframework中,是否可以自动记录方法selective | all所花费的时间。自动我的意思是,我不想去每个方法并编写log.debug ( "....“);东西。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-30 05:54:04

AOP是您在这里所需要的。AOP允许您在不修改原始代码的情况下向应用程序添加代码。Spring AOP更喜欢使用代理对象来实现这一点。代理对象使用Decorator模式包装原始的Target对象并添加代码。代理被配置为实现原始目标对象的一个或多个接口。

这里,为了给应用程序计时,我们的想法是使用PerformanceMonitorInterceptor,这是Spring Framework附带的性能监视类之一。

第一个选项是使用Spring类ProxyFactoryBean来创建Spring AOP代理对象。为此,请执行以下操作:

Advisor Advisor定义原始bean日志级别定义PerformanceMonitorInterceptor

  • Define RegexpMethodPointcutAdvisor

  • Define

  • 代理原始bean并应用ProxyFactoryBean

  • PerformanceMonitorInterceptor的日志级别设置为Advisor

下面是演示这些步骤的Spring配置:

代码语言:javascript
复制
<beans>
  <bean id="MyServiceTarget" class="org.myapp.services.MyService">
    <property ... />
  </bean>

  <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

  <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="timingLogger"/>
    <property name="patterns">
      <list>
        <value>.*</value>
      </list>
    </property>
  </bean>

  <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>org.myapp.services.MyService</value>
    </property>
    <property name="target"><ref local="MyServiceTarget"/></property>
    <property name="interceptorNames">
      <list>
        <value>timingAdvisor</value>
      </list>
    </property>
  </bean>
</beans>

PerformanceMonitorInterceptor的日志级别的配置

代码语言:javascript
复制
log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE

从Spring2.0开始,还有另一个选择:使用Spring 2.0 XML Schema-based configuration和Spring2.0的AspectJ style pointcut expressions。使用ProxyFactoryBean,您必须显式地声明要代理的接口;使用<aop:config><aop:advisor>标记,您可以自动代理bean容器中每个对象的每个接口。

代码语言:javascript
复制
<beans "add xsd declarations here" >
  <bean id="MyService" class="org.myapp.services.MyService">
    <property ... />
  </bean>

  <bean id="timingAdvice"
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

  <aop:config>
    <aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))"
      advice-ref="timingAdvice"/>
  </aop:config>
</beans>
票数 17
EN

Stack Overflow用户

发布于 2014-07-04 02:24:40

你可以看看stagemonitor。它是一个开源的java web应用程序性能监视器。它捕获响应时间指标、JVM指标、请求细节(包括由请求分析器捕获的调用堆栈)等。开销非常低。

您还可以选择使用强大的timeseries数据库石墨来存储数据点的长期历史记录,您可以使用花哨的仪表板查看这些数据点。

示例截图:

请查看project website以查看更多屏幕截图、功能描述和文档。

注:我是stagemonitor的开发者

票数 4
EN

Stack Overflow用户

发布于 2009-09-30 07:23:45

最后我想出了怎么做。

首先看一下'Pascal Thivent‘的帖子,它对我帮助很大。在更改您的log4j.properties并创建timingAdvisor之后,您必须将此adviser绑定到您希望启用调试的类。你必须像这样修改你的代码。

早期代码:

代码语言:javascript
复制
<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >                  
            <property name="anotherDao" ref="anotherDao"/>
    </bean>

新代码。

代码语言:javascript
复制
<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >                
        <property name="anotherDao" ref="anotherDao"/>
</bean>


    <bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
        <value>com.xyz.sc.db.dao.MyTableDao</value>
    </property>
    <property name="target"><ref local="myTableDaoTarget"/></property>
    <property name="interceptorNames">
        <list>
            <value>timingAdvisor</value>
        </list>
    </property>
</bean>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1496205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档