SpringAop在项目中的一些巧妙使用(一)---方法执行时间记录
来源:互联网 发布:做封面的软件 编辑:程序博客网 时间:2024/05/16 01:30
AOP的概念大家应该都知道吧,Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
这样配置之后我们就可以监控以Mapper结尾的方法了。同时我们可以监控其他的各种方法,只要我们进行相应的配置。
我们这样理解,AOP就是一个监控者,它在外面看着我们程序运行,同时也可以定一些规则,决定程序运行不运行,也可以在一个方法运行前进行处理,也可以在一个方法后进行一些逻辑处理。
以上是我对AOP一些简单的理解,我们知道他可以在方法前进行处理,方法后进行处理,那我们可以做的时候就很多了,例如我们可以监控一些方法运行的时间,例如我们项目中使用它监控了sql语句的执行时间。请看代码。
Java代码
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(); } }
相对应的配置文件
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结尾的方法了。同时我们可以监控其他的各种方法,只要我们进行相应的配置。
使用这种方式记录日志,下回分享。
0 0
- SpringAop在项目中的一些巧妙使用(一)---方法执行时间记录
- SpringAop在项目中的一些巧妙使用(二)--记录日志
- SpringAop在实际项目中的使用案例
- SpringAOP在项目中的简单应用
- jqplot使用过程中的一些记录(一)
- scss在angular+gulp中的使用(自己项目记录)
- 使用Spring的AOP实现接口方法执行时间记录
- SpringAOP(一) ProxyFactoryBean
- Selenium在使用中的一些常用方法
- springAOP日志记录数据库项目实例
- 项目架构中的一些想法(一)
- fis3在asp.net项目中的使用记录
- 使用PHP 5.0创建图形的巧妙方法(一)
- 位运算在Android Flag中的巧妙使用
- springAOP在实际开发中的作用
- 如何在history中记录命令执行时间
- 记录每个方法的执行时间 AOP
- Spring AOP实践--记录类方法执行时间
- XCode快捷键
- 第4课 MMU内存管理单元
- UPS延时计算
- JAVA递归生成tree树
- GestureDetector和SimpleOnGestureListener的使用教程
- SpringAop在项目中的一些巧妙使用(一)---方法执行时间记录
- SpringMVC 文件上传配置,多文件上传,使用的MultipartFile
- C#第四次作业
- LeetCode Palindrome Number
- 崩溃问题查找思路
- svn客户端中文乱码
- Android性能优化之Overdraw
- Esper学习之一:Esper介绍 .
- storm自带例子详解 (二)——BasicDRPCTopology