@AfterReturning 后置通知-注解有 returning 属性

208 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

定义切面:

@Aspect  //交给AspectJ框架扫描识别切面类\
@Component\
public class MyAspect {\
     */****\
**** *后置通知切面方法的规范**\
***** 1)* *访问权限是* *public**\
*** 2)* *切面方法没有返回值* *void**\
*** 3)* *方法自定义**\
***** 4)* *切面方法可以没有参数* *,* *如果有参数则是目标方法的返回值* *,* *也可以包含参数* *JoinPoint,* *它必须是第一个参数**\
***** 5)* *使用* *@AfterReturning* *注解**\
***** 6)* *参数* *value:* *指定切入点表达式**\
*****      returning:* *指定目标方法返回值的形参名称* *,* *此名称必须与切面方法的参数名称一致* *.**\
***/**\
***@AfterReturning(value = "execution(* com.bjpowernode.s02.SomeServiceImpl.*(..))",returning = "obj")\
    public void myAfterReturning(Object obj){\
        System.*out*.println("后置通知..........");\
        //改变目标方法的返回值\
        if(obj != null){\
            if(obj instanceof String){\
               String s =  ((String) obj).toUpperCase();//转为大写\
                System.*out*.println("在切面方法中的输出:"+s);\
            }\
            if(obj instanceof Student){\
               ((Student) obj).setName("李四");\
                System.*out*.println("在切面方法中的输出"+(Student)obj);\
            }\
        }\
    }\
}

测试类:

@Test\
public void test01(){\
    ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");\
    SomeServiceImpl someService = (SomeServiceImpl) ac.getBean("someServiceImpl");\
    System.*out*.println(someService.getClass());\
    String s = someService.doSome("张三",22);\
    System.*out*.println("在测试类中输出目标方法的返回值---"+s);\
}

运行结果:

image.png

可以改变目标方法的返回值(目标方法的返回值是引用类型)

@Test\
 public void test03(){\
     ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");\
     SomeServiceImpl someService = (SomeServiceImpl) ac.getBean("someServiceImpl");\
     System.*out*.println(someService.getClass());\
     Student stu = someService.change();\
     System.*out*.println("在测试类中输出目标方法的返回值---"+stu);\
 }

运行结果:

image.png

(1)  @Around环绕通知增强方法有ProceedingJoinPoint参数

在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值,Object 类型。并且方法可以包含一个 ProceedingJoinPoint  类型的参数。接口 ProceedingJoinPoint  其有一个proceed()方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法的返回值。