Fork me on GitHub

Spring切面编程Aspect之@Before和@Around用法

查看dao层使用的sql

复制代码
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SqlAspect{
    
    /**
     * 查看执行的service层
     * @param pjp
     */
    @Before("execution(* com.gmtx.*.services.*.*(..))")
    public void beforeService(JoinPoint pjp){
        System.out.println("---Service层业务---"+curDateTime());
        System.err.println("  getTarget: " + pjp.getTarget().getClass());
        System.err.println("  toShortString: " + pjp.toShortString());
        System.err.println("  Args: " + Arrays.toString(pjp.getArgs()).toString());
    }
    
    /**
     * 查看执行的sql
     */
    @Before("execution(* com.gmtx.system.dao.CommonDao..*(..))")
    public void before(JoinPoint pjp){
        //打印参数
        System.out.println("-------------参数--------------"+curDateTime());
        Object[] argsObjects = pjp.getArgs();
        for (Object obj:argsObjects) {
            if(obj!=null&&obj.getClass().isArray()){  //如果是数组
                System.out.println(ArrayUtils.toString(obj));
            }else {
                System.out.println(obj);   //不是数组
            }
        }
    }
    
    /**
     * 查看sql执行时间
     */
    @Around("execution(* com.gmtx.system.dao.CommonDao..*(..))")   /*切点 - 有Tag标记的Method*/
    public Object around(ProceedingJoinPoint pjp) throws Throwable {    /*增强*/
        long s = System.currentTimeMillis();
        Object result = pjp.proceed();
        long e = System.currentTimeMillis();
        System.out.println("-------------时长--------------"+(e-s));
        return result;
    }
    
    public String curDateTime(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        return df.format(new Date());// new Date()为获取当前系统时间
    }
}
复制代码

引用的jar包为aspectjrt.jar

遇到的问题

Handler execution resulted in exception: org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for:

public int  com.gmtx.bus.service.WarnService.updateByPrimaryKeySelective(com.gmtx.bus.model.Warn)

 

意思很明确,AOP拦截返回的null值和java原始类型不匹配,需要把被service的返回值int改为封装类Integer。

 

 

posted @   秋夜雨巷  阅读(3743)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示