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。
如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步