1. 程式人生 > >Spring(12):使用註解(@AfterThrowing/@After/@Around)實現AOP異常增強與例項

Spring(12):使用註解(@AfterThrowing/@After/@Around)實現AOP異常增強與例項

2017/12/31

【1】異常丟擲增強:

在包(com\smbms\AopLog)新建一個ErrorLogger.java:

package com.smbms.AopLog;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class ErrorLogger {
	private static final Logger log = Logger.getLogger(UserserviceLogger.class);
	
	@AfterThrowing(pointcut="execution(* com.smbms.pojo..*.*(..))",throwing="e")
	public void afterthrowing(JoinPoint jp,RuntimeException e){
		log.error(jp.getSignature().getName()+" ++++++*****++++ method exception happens!!!  ++++++*****++++: "+ e);
	}
}
解釋:

1、@AfterThrowing 註解;


【2】最終增強:

在包(com\smbms\AopLog)新建一個AfterLogger.java:

package com.smbms.AopLog;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;

@Aspect
//最終增強
public class AfterLogger {
	private static final Logger log = Logger.getLogger(UserserviceLogger.class);
	
	@After("execution(* com.smbms.pojo..*.*(..))")
	public void after(JoinPoint jp){
		log.info(jp.getSignature().getName()+"+++ method excute end!++");
	}

}
解釋:

1、@After註解;


【3】環繞增強:

在包(com\smbms\AopLog)新建一個AroundLogger.java:

package com.smbms.AopLog;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AroundLogger {
	private static final Logger log = Logger.getLogger(UserserviceLogger.class);
	
	@Around("execution(* com.smbms.pojo..*.*(..))")
	public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
		log.info("***UserserviceLogger*********before:呼叫了"+jp.getTarget()+" 的"+jp.getSignature().getName()
				+" 方法。方法入參:"+Arrays.toString(jp.getArgs()));
		try{
			Object result = jp.proceed();
			log.info("呼叫了 "+jp.getTarget()+" 的 "+jp.getSignature().getName()
					+" 方法。");
			return result;
		}catch(Throwable e){
			log.error(jp.getSignature().getName()+" Exception...方法發生異常: "+e);
			throw e;
		}finally{
			log.info(jp.getSignature().getName()+" ENDING.....方法執行結束");
		}
		
	}
}
解釋:

1、@Around 註解

2、宣告ProceedingJoinPoint 型別引數可以獲取連線點的資訊;

測試方法還在研究,因為異常發生時,控制檯就不會輸出,所以稍後再完善該博文。