spring AOP @AfterThrowing沒有返回值的原因
阿新 • • 發佈:2019-01-06
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.apache.shiro.web.servlet.ShiroHttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * 類說明:系統服務元件Aspect切面Bean * * @author 作者 LzwGlory * @version 建立時間:2015年12月14日 下午5:36:13 */ @Component @Aspect public class ServiceAspect { private static final Logger log = Logger.getLogger(ServiceAspect.class); // 配置切入點,該方法無方法體,主要為方便同類中其他方法使用此處配置的切入點 @Pointcut("execution(* com.ultrapower.rw.web.ows.controller.app..*(..))") public void aspect() { } /* * 配置前置通知,使用在方法aspect()上註冊的切入點 同時接受JoinPoint切入點物件,可以沒有該引數 */ @Before("aspect()") public void before(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs();// 獲得目標方法的引數 String name = joinPoint.getSignature().getName();// 獲得目標方法名 log.info("<=============" + name + "方法--AOP 前置通知=============>"); if (args != null && args.length > 0 && args[0].getClass() == ShiroHttpServletRequest.class) { HttpServletRequest request = (HttpServletRequest) joinPoint .getArgs()[0]; String requestURI = request.getRequestURI(); @SuppressWarnings("unchecked") Map<String, String> parameterMap = request.getParameterMap(); StringBuilder paramStr = new StringBuilder(); for (Map.Entry<String, String> param : parameterMap.entrySet()) { paramStr.append(param.getKey()).append("=") .append(param.getValue()); } if (paramStr.length() > 0) { requestURI = requestURI + "?" + paramStr.toString(); } log.info(name + " 方法請求路徑與引數:" + requestURI); } } // 配置後置通知,使用在方法aspect()上註冊的切入點 @After("aspect()") public void after(JoinPoint joinPoint) { if (log.isInfoEnabled()) { String name = joinPoint.getSignature().getName();// 獲得目標方法名 log.info("<=============" + name + "方法--AOP 後置通知=============>"); } } // 配置環繞通知,使用在方法aspect()上註冊的切入點 @Around("aspect()") public Object around(ProceedingJoinPoint joinPoint) { String name = joinPoint.getSignature().getName();// 獲得目標方法名 log.info("<=============" + name + "方法--AOP 環繞通知=============>"); long start = System.currentTimeMillis(); Object result = null; try { result = joinPoint.proceed(); long end = System.currentTimeMillis(); if (log.isInfoEnabled()) { log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!"); } } catch (Throwable e) { long end = System.currentTimeMillis(); if (log.isInfoEnabled()) { log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage()); } } return result; } // 配置後置返回通知,使用在方法aspect()上註冊的切入點 @AfterReturning(pointcut = "aspect()", returning = "result") public void afterReturn(JoinPoint joinPoint, Object result) { String name = joinPoint.getSignature().getName();// 獲得目標方法名 log.info("<=============" + name + "方法--AOP 後置返回通知=============>"); log.info(name + "方法返回引數:" + result); } // 配置丟擲異常後通知,使用在方法aspect()上註冊的切入點 @AfterThrowing(pointcut = "aspect()", throwing = "ex") public void afterThrow(JoinPoint joinPoint, Exception ex) { String name = joinPoint.getSignature().getName();// 獲得目標方法名 log.info("<=============" + name + "方法--AOP 異常後通知=============>"); log.info(name + "方法丟擲異常為:" + "\t" + ex.getMessage()); } }
由於@Around沒有返回值