SpringAop在项目中的一些巧妙使用(一)---方法执行时间记录

      从事java行业已经半年,项目不大不小算做了两个了,这两天正在进行简单的总结,发现AOP是结合动态代理是在某些时候能发挥很神奇的作用,就拿出来跟大家分享一年。

     AOP的概念大家应该都知道吧,Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

     我们这样理解,AOP就是一个监控者,它在外面看着我们程序运行,同时也可以定一些规则,决定程序运行不运行,也可以在一个方法运行前进行处理,也可以在一个方法后进行一些逻辑处理。

    以上是我对AOP一些简单的理解,我们知道他可以在方法前进行处理,方法后进行处理,那我们可以做的时候就很多了,例如我们可以监控一些方法运行的时间,例如我们项目中使用它监控了sql语句的执行时间。请看代码。

package net.zoneland.test.common.util.aop;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.time.StopWatch;
import org.apache.log4j.Logger;

/**
 *用来监控方法的执行时间-- 对应配置文件是spring-method-aop.xml
 * @author wangyong
 * @version $Id: MethodTimeAdvice.java, v 0.1 2012-9-18 下午4:30:32 wangyong Exp $
 */
public class MethodTimeAdvice implements MethodInterceptor {

    private final static Logger logger = Logger.getLogger("DAL-MONITOR");

    /**
     * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
     */
    public Object invoke(MethodInvocation invocation) throws Throwable {
        //用 commons-lang 提供的 StopWatch 计时,Spring 也提供了一个 StopWatch
        StopWatch clock = new StopWatch();
        clock.start(); //计时开始
        Object result = null;
        //监控的类名
        String className = invocation.getMethod().getDeclaringClass().getSimpleName();
        //监控的方法名
        String methodName = className + "." + invocation.getMethod().getName();
        try {
            //这个是我们监控的bean的执行并返回结果
            result = invocation.proceed();
        } catch (Throwable e) {
            //监控的参数
            Object[] objs = invocation.getArguments();
            logger.error("数据库执行异常,方法名:" + methodName + "参数:" + getString(objs), e);
            throw e;
        }
        clock.stop(); //计时结束
        if (logger.isInfoEnabled()) {
            logger.info("执行时间:" + clock.getTime() + " ms [" + methodName + "]");
        }
        return result;
    }

    /**
     * 这个类主要是用于输出方法的参数
     * 
     * @param objs
     * @return
     */
    @SuppressWarnings("unchecked")
    public String getString(Object[] objs) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0, len = objs.length; i < len; i++) {
            if (objs[i] instanceof String) {
                stringBuffer.append("String类型:" + objs[i].toString());
            } else if (objs[i] instanceof Map) {
                HashMap<String, Object> hashMap = (HashMap<String, Object>) objs[i];
                HashMap<String, Object> map = hashMap;
                HashSet<String> set = (HashSet<String>) map.keySet();
                stringBuffer.append("Map类型");
                for (String str : set) {
                    stringBuffer.append(str + "=" + map.get(str));
                }
            } else if (objs[i] instanceof Integer) {
                stringBuffer.append("整数类型:");
                stringBuffer.append(objs[i].toString());
            } else {
                stringBuffer.append(objs[i].toString());
            }
        }
        return stringBuffer.toString();
    }
}

 相对应的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

	<bean id="methodTimeAdvice" class="net.zoneland.ums.common.dal.aop.MethodTimeAdvice" />

	
    <!-- 根据 Bean 的名字自动实现代理拦截 -->
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="interceptorNames">
			<!-- 我们的监控方法 -->>
			<list>
				<value>methodTimeAdvice</value>
			</list>
		</property>
		<property name="beanNames">
			<list>
			    <!-- 添加到其中的 Bean 自动就被代理拦截了 -->
				<value>*Mapper</value>
			</list>
		</property>
	</bean>
</beans>

 这样配置之后我们就可以监控以Mapper结尾的方法了。同时我们可以监控其他的各种方法,只要我们进行相应的配置。

使用这种方式记录日志,下回分享。

SpringAop在项目中的一些巧妙使用(二)--记录日志 编辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值