转载自:http://743389831.iteye.com/blog/1755241
?
? ? ?AOP的概念大家应该都知道吧,Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
???? 我们这样理解,AOP就是一个监控者,它在外面看着我们程序运行,同时也可以定一些规则,决定程序运行不运行,也可以在一个方法运行前进行处理,也可以在一个方法后进行一些逻辑处理。
??? 以上是我对AOP一些简单的理解,我们知道他可以在方法前进行处理,方法后进行处理,那我们可以做的时候就很多了,例如我们可以监控一些方法运行的时间,例如我们项目中使用它监控了sql语句的执行时间。请看代码。
Java代码??
class="star" alt="收藏代码">
- 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;??
- ??
- ?
- ?
- ?
- ?
- ??
- public?class?MethodTimeAdvice?implements?MethodInterceptor?{??
- ??
- ????private?final?static?Logger?logger?=?Logger.getLogger("DAL-MONITOR");??
- ??
- ?????
- ?
- ??
- ????public?Object?invoke(MethodInvocation?invocation)?throws?Throwable?{??
- ??????????
- ????????StopWatch?clock?=?new?StopWatch();??
- ????????clock.start();???
- ????????Object?result?=?null;??
- ??????????
- ????????String?className?=?invocation.getMethod().getDeclaringClass().getSimpleName();??
- ??????????
- ????????String?methodName?=?className?+?"."?+?invocation.getMethod().getName();??
- ????????try?{??
- ??????????????
- ????????????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;??
- ????}??
- ??
- ?????
- ?
- ?
- ?
- ?
- ??
- ????@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();??
- ????}??
- }??
?相对应的配置文件
Java代码??
- <?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结尾的方法了。同时我们可以监控其他的各种方法,只要我们进行相应的配置。
使用这种方式记录日志,下回分享。