一尘不染

如何记录Springframework中方法花费的时间?

java

是否有可能在springframework中记录方法所花费的时间?全部]自动。我的意思是,我不想进入每种方法并编写log.debug(“ ....”);
东西。


阅读 223

收藏
2020-12-03

共1个答案

一尘不染

AOP是您在这里需要的。AOP允许您将代码添加到您的应用程序,而无需修改原始代码。Spring AOP倾向于使用 Proxy 对象来完成此任务。
代理 对象使用装饰器模式包装原始 Target 对象并添加代码。所述 代理 被配置为实现原始的一个或多个接口 的目标 对象。

在这里,为应用程序计时的想法是使用PerformanceMonitorInterceptorSpring框架附带的性能监视类之一。

第一种选择是使用Spring类ProxyFactoryBean创建Spring AOP 代理 对象。去做这个:

  • 定义您的 原始bean
  • 定义一个PerformanceMonitorInterceptor
  • 定义一个RegexpMethodPointcutAdvisor
  • 定义一个ProxyFactoryBean代理原始bean并应用 Advisor
  • 将日志级别设置PerformanceMonitorInterceptorTRACE

在Spring配置下面说明了这些步骤:

<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

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE

从Spring 2.0开始,还有另一个选择:使用基于Spring 2.0 XML
Schema的配置
和Spring的AspectJ样式切入点表达式。使用,ProxyFactoryBean您必须显式声明要代理的接口。使用<aop:config><aop:advisor>标记,您可以自动代理Bean容器中每个对象的每个接口。

<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>
2020-12-03