在Spring框架中,是否可以自动记录方法所需的时间(选择性或全部)。我指的是自动地,而不是要去每个方法里写log.debug("...")。
PerformanceMonitorInterceptor
之一,它是与Spring Framework一起提供的性能监视类之一。ProxyFactoryBean
创建Spring AOP代理对象。要做到这一点:
PerformanceMonitorInterceptor
:RegexpMethodPointcutAdvisor
:ProxyFactoryBean
来代理您的原始bean并应用您的AdvisorPerformanceMonitorInterceptor
的日志级别设置为TRACE<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模式的配置和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>
最终我弄明白了如何做到这一点。
首先查看 'Pascal Thivent' 的帖子,它对我有很大帮助。在更改您的log4j.properties并创建timingAdvisor之后,您需要将此顾问绑定到要启用调试的类上。您需要像这样更改您的代码。
原始代码:
<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >
<property name="anotherDao" ref="anotherDao"/>
</bean>
新代码。
<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>
我看到这里已经有一个被接受的答案了,但我鼓励大家去看一下Spring Toolsuite(SpringSource的Eclipse发行版)的最新版本。它自带一个分析工具,Spring Insight,在运行时以漂亮的格式提供这些精确的统计数据。只需将您的应用程序部署到其内部tomcat,访问几个页面,然后转到/insight servlet,查看每个调用方法所花费的时间,一直到执行的SQL语句及其所花费的时间。
这里是一个关于Spring Insight的不错的介绍文章,只需几分钟即可获得您想要的内容。http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/
ProxyFactoryBean
代理Spring beans。 - Pascal Thivent