您的位置:首页 > 编程语言 > Java开发

基于spring的前置后置及环绕通知

2016-11-11 00:00 423 查看
因为项目需要去监控方法的执行时间,从大神处晓得通过环绕通知可以实现这个功能,所以自己研究了下,,找了点网上的例子,模仿出来了一个,代码如下

package com.mm.service.util;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class OperateLogger {

private static Log logger = LogFactory.getLog("operateLogger");
/**
* 前置通知
* @param thisJoinPoint
*/
public void beforeExecute(JoinPoint thisJoinPoint){
}
/**
* 环绕通知类
* @param thisJoinPoint
* @return
* @throws Throwable
*/
public Object userOperate(ProceedingJoinPoint thisJoinPoint) throws Throwable {
long befoerTime = new Date().getTime();
Object obj = thisJoinPoint.proceed();// 此句执行业务逻辑方法
long endTime = new Date().getTime();

// 目标组件的类名
String className = thisJoinPoint.getTarget().getClass().getName();
// 调用的方法名
String method = thisJoinPoint.getSignature().getName();
logger.info("方法:"+ className + "/" + method + "执行了 " + CommonUtil.getRunTime(befoerTime, endTime));
return obj;// 返回值 可不返回obj(业务逻辑的返回值)
}
/**
* 后置通知类
* @param thisJoinPoint
*/
public void  afterExecute(JoinPoint thisJoinPoint){
}
}

前置方法与后置方法没有去进行操作,,环绕方法进行的是在执行前获取一个时间,然后去执行业务逻辑,完成后再去获取当前时间然后做减法获得程序的执行时间,并且用log打印出来

xml配置如下

<bean id="operateLogger" class="com.mm.service.util.OperateLogger"></bean>
<aop:config>
<!-- 定义切面 -->
<aop:aspect id="aopAspect" ref="operateLogger">
<!-- 定义切点 -->
<aop:pointcut id="pointcut"
expression="execution(* com.wonders.hs.pd.mm.service.contoller.*.*(..))"/>
<!--  <aop:around method="userOperate" pointcut="within(com.mm.service.contoller..*)"/> -->
<!-- 定义通知 -->
<aop:before pointcut-ref="pointcut" method="beforeExecute"/>
<aop:around pointcut-ref="pointcut" method="userOperate"/>
<aop:after  pointcut-ref="pointcut" method="afterExecute"/>
</aop:aspect>
</aop:config>

xml配置:先定义通知方法,然后定义切面及切点,,然后在里面再去定义切面的通知方法,我这里主要是需要获取controller层方法执行所需要的时间

程序执行结果如下

2016-11-11 13:45:25,440 INFO [sqlLogs] - 方法:com.mm.service.contoller.GoodsManagerContoller/GetGoodsToDataSetForWeb执行了 708 毫秒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 通知
相关文章推荐