package com.richie.framework.service; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class LogExAop { public static int PROCESS_TIME_OUT =12; /** 定义共用方法切入点 */ @Pointcut("execution(public * *(..))") public void inPublicMethod() { } /** 定义数据访问类方法切入点 */ @Pointcut("execution(* com.richie.*.dao.*.*(..))") public void inDAOPackage() { } /** 定义业务处理类方法切入点 */ @Pointcut("execution(* com.richie.*.service.*.*(..))") public void inServicePackage() { } /** web层方法切入点 */ @Pointcut("execution(* com.richie.*.web.*.*(..))") public void inWebPackage() { } /** 所有的public方法(包括web、service) */ @Pointcut("inPublicMethod() && (inDAOPackage()||inServicePackage() ||inWebPackage())") public void supportAOP() { } /** 切入点执行范围 主要记录类处理花费时间 主要用于调试用 * @param pjp 切入点 * @throws Throwable 切入点抛出的异常 */ @Around("supportAOP()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { Logger log = Logger.getLogger(pjp.getTarget().getClass()); StringBuilder sb = new StringBuilder(); sb.append("\n==================【") .append(pjp.getTarget().getClass().getName()) .append(".") .append(pjp.getSignature().getName()) .append("】"); long begin = System.currentTimeMillis(); //实际方法执行 Object result = pjp.proceed(); long end = System.currentTimeMillis(); sb.append("花费时间:[").append((end - begin)/1000).append("s]"); log.debug(sb.toString()); return result; } /** 切入点抛出异常 记录日志 * @param jp 切入点 * @param ex 抛出的异常 */ @AfterThrowing(pointcut = "supportAOP()", throwing = "ex") public void doThrowing(JoinPoint jp, Throwable ex) { Logger log = Logger.getLogger(jp.getTarget().getClass()); log.error(ex.getMessage(), ex); } }
注意点:
1. Spring的配置中引入下列元素来启用Spring对@AspectJ的支持:
<aop:aspectj-autoproxy />
2.LogExAop 要在Spring 作为bean 配置
<bean id="logExe" class="com.richie.framework.service.LogExAop">
</bean>