package com.layne.spring.aspect.aspects;
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;
@Aspect //表示当前POJO类为切面
public class MyAspect {
//定义前置通知方法
@Before("execution(* *..ISomeService.doSome(..))")
public void myBefore(){
System.out.println("执行前置通知方法myBefore");
}
//定义前置通知方法
@Before(value = "execution(* *..ISomeService.doSome(..))")
public void myBefore(JoinPoint jp){ //所有通知类型下,都有这个参数
System.out.println("执行前置通知方法 Jp="+jp);
}
//定义前置通知方法
@AfterReturning("execution(* *..ISomeService.doSecond(..))")
public void afterReturning(){
System.out.println("执行后置通知方法 ``````");
}
//定义后置通知方法
@AfterReturning(value = "execution(* *..ISomeService.doSecond(..))",returning="result")
public void afterReturning(Object result){
System.out.println("执行后置通知方法 result="+result);
}
//环绕通知方法
@Around("execution(* *..ISomeService.doThird(..))")
public Object MyAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("执行目标方法之前执行···000000");
Object proceed = pjp.proceed();
String upperCase = ((String)proceed).toUpperCase();
System.out.println("执行目标方法之后执行····00000");
return upperCase;
}
//异常通知
@AfterThrowing(value="execution(* *..ISomeService.doSome(..))",throwing="ex")
public void myThrows(Exception ex){
System.out.println("执行异常通知······ex="+ex.getMessage());
}
//最终通知
@After("doSomePointCut()")
public void myAfter(){
System.out.println("执行最终通知+++++++00999999999000+++++++");
}
//定义通知的切点
@Pointcut(value="execution(* *..ISomeService.doSome(..))")
private void doSomePointCut(){};
}