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 类型参数可以获取连接点的信息;
测试方法还在研究,因为异常发生时,控制台就不会输出,所以稍后再完善该博文。