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;
    }
经验分享 程序员 微信小程序 职场和发展