首先实现接口
package com.yifeng.report.framework.aop;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.PatternMatchUtils;
/**
* <p>
* 定义环绕通知
* </p>
*
* @author heyin
* @version 1.0
*/
public class LogAroundAdvice implements MethodInterceptor {
/** 要拦截的方法规则*/
private List<String> methodNames = new LinkedList<String>();
protected Logger logger = LoggerFactory.getLogger(LogAroundAdvice.class);
/** 执行时限*/
private Long time;
/**
* <p>
* 执行时限
* </p>
*
* @param time
*/
public void setTime(Long time) {
this.time = time;
}
/**
* <p>
* 设置要拦截方法名称
* </p>
*
* @param methodNames
*/
public void setMethodNames(List<String> methodNames) {
this.methodNames = methodNames;
}
@Override
public Object invoke(MethodInvocation methodinvocation) throws Throwable {
Object result = null;
Method targetMethod = methodinvocation.getMethod();
if(matches(targetMethod)){
Long start = System.currentTimeMillis();
result = methodinvocation.proceed();
Long end = System.currentTimeMillis();
Long excuteTime = end - start;
//超过时限就记录花费时间
if(excuteTime >= time){
logger.info(targetMethod.getDeclaringClass().getName()+" "
+targetMethod.getName() + " 方法结束工作... 花费时间(ms):"+(end-start));
}
} else {
result = methodinvocation.proceed();
}
return result;
}
/**
* <p>
* 判断方法是否匹配
* </p>
*
* @param method
* @return true匹配 false不匹配
*/
public boolean matches(Method method){
for(int i = 0; i < methodNames.size(); i++) {
String mappedName = methodNames.get(i);
if(mappedName.equals(method.getName()) || isMatch(method.getName(), mappedName)){
return true;
}
}
return false;
}
/**
* <p>
* 判断单个方法是否匹配
* </p>
*
* @param methodName
* @param mappedName
* @return true匹配 false不匹配
*/
protected boolean isMatch(String methodName, String mappedName) {
return PatternMatchUtils.simpleMatch(mappedName, methodName);
}
}
spring 中配置文件
<bean id="logAroundAdvice" class="com.yifeng.report.framework.aop.LogAroundAdvice">
<!-- 执行时限 单位毫秒 (大于等于则记录日志) -->
<property name="time" value="500"/>
<!-- 拦截的方法规则 -->
<property name="methodNames">
<list>
<value>save*</value>
<value>insert*</value>
<value>create*</value>
<value>update*</value>
<value>delete*</value>
<value>remove*</value>
<value>batch*</value>
<value>execute*</value>
<value>grant*</value>
<value>clear*</value>
<value>get*</value>
<value>find*</value>
<value>query*</value>
<value>search*</value>
<value>doJob</value>
<value>executeOne</value>
</list>
</property>
</bean>
<!-- 所有Service结尾的Bean需要自动创建事务代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<value>*Service</value>
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>dsTransactionInterceptor</value>//这个是我的事务拦截
<value>logAroundAdvice</value>//这是自定义AOP拦截
</list>
</property>
</bean>