在 Spring 中有一个内置的支持。
我试图寻找教程,但令人惊讶的是我没有找到一个,所以我将在这里尝试解释它。(编辑:我在我的博客中添加了这个例子)
基本上你需要的是像这样扩展 CustomizableTraceInterceptor 类:
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 属性,还可以更改输出格式。
这应该足以让你开始。如果您需要澄清,请不要犹豫。