1. 程式人生 > >spring AOP @AfterThrowing沒有返回值的原因

spring AOP @AfterThrowing沒有返回值的原因

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沒有返回值