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

Rak*_*yal 9 java logging spring log4j

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

Pas*_*ent 17

AOP就是你需要的.AOP允许您在不修改原始代码的情况下向应用程序添加代码.Spring AOP更喜欢使用Proxy对象来完成此任务.代理对象使用装饰器模式来包装原始Target对象并添加代码.所述代理被配置为实现原始的一个或多个接口的目标对象.

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

第一个选项是使用Spring类ProxyFactoryBean创建Spring AOP Proxy对象.去做这个:

  • 定义原始bean:
  • 定义一个PerformanceMonitorInterceptor:
  • 定义一个RegexpMethodPointcutAdvisor:
  • 定义一个ProxyFactoryBean代理原始bean并应用您的顾问
  • 设置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>
Run Code Online (Sandbox Code Playgroud)

以及日志级别的配置PerformanceMonitorInterceptor:

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE
Run Code Online (Sandbox Code Playgroud)

从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>
Run Code Online (Sandbox Code Playgroud)

  • 该配置片段本身不会做任何事情.您需要声明一个Spring AOP BeanPostProcessor(或者它是一个BeanFactoryPostProcessor)来使用timingAdvisor自动代理bean. (2认同)