Spring AOP @AfterReturning 总是返回null
Spring AOP @AfterReturning 总是返回null
当 @Around(环绕通知)与 @AfterReturning(后置通知)共存时,@AfterReturning 通过属性 returning = “rel” 获取目标方法的返回值时结果总为null,如下:
切面代码:
package com.czxy.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import sun.text.normalizer.UBiDiProps;
@Component
@Aspect
public class PersonAspect {
@Pointcut("execution(public String com.czxy.domain.Person.eat())")
public void p01(){
}
@Before("p01()")
public void b01(){
System.out.println("洗手手");
}
@Around("p01()")
public void ar(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("洗手");
System.out.println("擦嘴");
}
@After("p01()")
public void b02(){
System.out.println("谁教教");
}
@AfterReturning(value = "p01()",returning ="rel" )
public void b03(JoinPoint joinPoint,Object rel){
System.out.println("嘿嘿嘿"+rel);
}
@AfterThrowing(value="p01()",throwing="ex")
public void at(JoinPoint joinPoint ,Throwable ex){
System.out.println("异常:" + ex.getMessage());
}
}
目标类代码:
package com.czxy.demo;
import com.czxy.config.SpringConfig;
import com.czxy.domain.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class Demo01 {
@Resource
private Person person;
@Test
public void t01(){
person.eat();
// int i = 1/0;
}
}
运行结果: 是因为在切面类里面环绕通知的返回值是void,所以返回值是空的 正确结果:
@Around("p01()")
public Object ar(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("洗手");
Object o = pjp.proceed();
System.out.println("擦嘴");
return o;
}
