Spring 对此有内置支持。
我试图寻找教程,但令人惊讶的是我没有找到教程,所以我将尝试在这里解释它。 (编辑:我将此示例添加到我的博客中here http://idevone.wordpress.com/2009/09/02/howto-simple-profiling-with-spring-aop/)
基本上你需要的是扩展 CustomizedTraceInterceptor 类,如下所示:
public class MyTraceInterceptor extends CustomizableTraceInterceptor {
protected void writeToLog(Log logger, String message, Throwable ex) {
if (ex != null) {
logger.info(message, ex);
} else {
logger.info(message);
}
}
protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
return true;
}
}
此类包装您的 bean 并将方法调用信息(包括参数、返回值和执行时间)输出到日志。通过改变writeToLog()
您可以控制要输出数据的位置以及严重性的方法。
现在您需要一些 XML 来实际选择要包装的 bean:
<!-- Tracing -->
<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none">
<property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/>
<property name="exitMessage"
value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none">
<property name="beanNames" value="*RequestListener,*Notifier"/>
<property name="proxyTargetClass" value="true"/>
<property name="interceptorNames">
<list>
<value>traceInterceptor</value>
</list>
</property>
<property name="order" value="2"/>
</bean>
基本上,您可以在“beanNames”中使用通配符定义要包装的bean,而“order”控制包装的顺序 - 如果您没有其他 AOP 类,则可以将其删除。如果更改 EnterMessage 和 exitMessage 属性,还可以更改输出格式。
这应该足以让您开始。如果您需要澄清,请随时询问。