@Aspect @Component public class MyAspect { @Around(value = "execution(* com.wzx.s05..*.*(..))") public Object myAround(ProceedingJoinPoint pjp) throws Throwable { //前切功能实现 System.out.println("环绕通知中的前置功能实现..........."); //目标方法调用 Object obj = pjp.proceed(pjp.getArgs()); //后切功能实现 System.out.println("环绕通知中的后置功能实现..........."); return obj.toString().toUpperCase(); //改变了目标方法的返回值 } @Before(value="execution(* com.wzx.s05.*.*(..))") public void myBefore(JoinPoint jp) { System.out.println("切面方法中的前置通知功能的实现................."); } @AfterReturning(value = "execution(* com.wzx.s05.*.*(..))",returning = "obj") public void myAfterreturning(Object obj){ System.out.println("后置通知功能实现.............."); if (obj != null) { if (obj instanceof String ) { //判断obj是不是String类型用instanceof obj=obj.toString().toUpperCase() ; System.out.println("在切面方法中目标方法的返回值"+obj); } if(obj instanceof Student){ Student stu=(Student) obj; stu.setName("李四"); System.out.println("在切面方法中目标方法的返回值:"+stu); } } } @After(value = "execution(* com.wzx.s05.*.*(..))") public void myAfter(){ System.out.println("最终通知的功能.............."); } }
由于每次都要写
value = "execution(* com.wzx.s05.*.*(..))"
太麻烦,而且代码重复率太高
增加@Pointcut注解
@Pointcut(value = "execution(* com.wzx.s05..*.*(..))")
public void mycut(){}
增加空参数,以后所有的value = "execution(* com.wzx.s05.*.*(..))"都等于mycut
于是代码就变成
@Aspect
@Component
public class MyAspect {
@Pointcut(value = "execution(* com.wzx.s05..*.*(..))")
public void mycut(){}
@Around(value = "mycut()")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
//前切功能实现
System.out.println("环绕通知中的前置功能实现...........");
//目标方法调用
Object obj = pjp.proceed(pjp.getArgs());
//后切功能实现
System.out.println("环绕通知中的后置功能实现...........");
return obj.toString().toUpperCase(); //改变了目标方法的返回值
}
@Before(value="mycut()")
public void myBefore(JoinPoint jp) {
System.out.println("切面方法中的前置通知功能的实现.................");
}
@AfterReturning(value = "mycut()",returning = "obj")
public void myAfterreturning(Object obj){
System.out.println("后置通知功能实现..............");
if (obj != null) {
if (obj instanceof String ) { //判断obj是不是String类型用instanceof
obj=obj.toString().toUpperCase() ;
System.out.println("在切面方法中目标方法的返回值"+obj);
}
if(obj instanceof Student){
Student stu=(Student) obj;
stu.setName("李四");
System.out.println("在切面方法中目标方法的返回值:"+stu);
}
}
}
@After(value = "mycut()")
public void myAfter(){
System.out.println("最终通知的功能..............");
}
}