使用AOP,在spring中实现简单的性能测试

// ###########start of class
package rbase.core.spring.profile;

import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 性能测试,测试一个方法开始到结束所需的时间<br>
 * log4j.properties 配置 <code>
 *     log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file
 *
 *     ### direct messages to file log ###
 *     log4j.appender.file=org.apache.log4j.FileAppender
 *     log4j.appender.file.File=profile.log
 *     log4j.appender.file.layout=org.apache.log4j.PatternLayout
 *     log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
 * </code>
 *
 * @author ronald
 *             ronaldchan2005(at)gmail.com
 */
public class UseTimeProfilerIntercepter implements MethodInterceptor {
    private List<String> patterns;

    private static final Log log = LogFactory
            .getLog(UseTimeProfilerIntercepter.class);

    public Object invoke(MethodInvocation inv) throws Throwable {
        String methodName = inv.getMethod().getName();

        /**
         * 如果不匹配方法名字则直接调用并返回
         */
        if (patterns == null || !isMatch(methodName)) {
            return inv.proceed();
        }

        String className = null;
        long startTime = 0L;

        Object obj = null;

        if (log.isTraceEnabled()) {
            className = inv.getThis().getClass().getSimpleName();
            Date now = new Date();
            startTime = now.getTime();
            Object[] os = inv.getArguments();

            log.trace(MessageFormat.format(
                "[{2}] start, [{0}] mothod [{1}].args is [{3}]", className,
                methodName, now, toString(os)));
        }

        obj = inv.proceed();

        if (log.isTraceEnabled()) {
            Date now = new Date();
            long endTime = now.getTime();
            long useTime = endTime - startTime;

            log.trace(MessageFormat.format(
                "[{2}] end, [{0}] mothod [{1}] use [{3}]", className,
                methodName, now, useTime));
        }

        return obj;
    }

    public void setPatterns(List<String> patterns) {
        this.patterns = patterns;
    }

    private boolean isMatch(String methodName) {
        for (String s : patterns) {
            if (Pattern.matches(s, methodName)) {
                return true;
            }
        }

        return false;
    }

    private String toString(Object[] os) {
        if (os == null || os.length == 0) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (Object o : os) {
            sb.append(MessageFormat.format("{0}={1},", o.getClass()
                    .getSimpleName(), o.toString()));
        }
        return sb.toString();
    }
}
// ################# end of class

使用,
1,先要配置log4j.properties,添加以下内容
说明:profile.log可以改为绝对路径.(如:c:/profile.log).这样,输出的语句将记录在c:/profile.log文件中
############# start #############
 log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file 
  ### direct messages to file log ###
  log4j.appender.file=org.apache.log4j.FileAppender
  log4j.appender.file.File=profile.log
  log4j.appender.file.layout=org.apache.log4j.PatternLayout
  log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
############# end #############

2,在applicationContext.xml中添加一个bean,如下
    <!-- 定义一个拦截器(可以定义多个) -->
    <bean id="profile-intercepter"
        class="rbase.core.spring.profile.UseTimeProfilerIntercepter">
        <property name="patterns">
            <list>
               <!-- 要进行测试的方法名的正则表达式 -->
                <value>.*create.*</value>
                <value>.*list.*</value>
            </list>
        </property>
    </bean>

    <!-- 定义BeanNameAutoProxyCreator-->
    <bean
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <!--  指定对满足哪些bean name的bean自动生成业务代理 -->
        <property name="beanNames">
            <!--  下面是所有需要自动创建事务代理的bean,如下为要UserManagerImpl进行性能测试-->
            <list>
                <value>UesrManagerImpl</value>
            </list>
            <!--  此处可增加其他需要自动创建事务代理的bean-->
        </property>
        <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
        <property name="interceptorNames">
            <list>
                <value>profile-intercepter</value>
                <!-- 此处可增加其他新的Interceptor -->
            </list>
        </property>
    </bean>


说明:以上的例子是要对UserManagerImpl的方法名中包含create,list字符的方法进行性能测试.
测试的结果将会放在profile.log中.
这是一个简单的性能测试方法,这样不用改变任何的业务方法就能进行测试,当不需测试的时候,只要在applicationContext.xml中删除刚
添加的内容就能不对该方法进行性能测试.希望这对大家找到性能瓶颈有帮助.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值