AOP切面讲解(四)之AfterReturning增强处理

947 阅读2分钟

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

类似于使用@Before注解可以修饰Before增强处理,使用@AfterReturning可修饰AfterReturning增强处理,AfterReturning增强处理将在目标方法正常完成后被织入。能够获取到目标方法的返回值,可以根据这个返回值做不同的处理功能。

一、参数

使用@AfterReturning注解可指定属性。

1、pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。

2、returning:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。除此之外,在Advice方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值。

二、方法的定义要求

  • 公共方法public
  • 方法没有返回值
  • 方法名称自定义
  • 方法有参数,推荐是object 参数名自定义

三、使用案例

1、先定义切入点

    //指明切入点
    @Pointcut(value = "execution(* com.example.aopdemo.iservice.ISysLogService.testAfterReturning1(..))")
    public void testAfterReturing(){};

    @AfterReturning(pointcut = "testAfterReturing()")
    public void logTestAfterReturing(){
        System.out.println("测试AfterReturing---pointcut");
    }

2、直接使用切入表达式,指明切入点

    @AfterReturning(pointcut = "execution(* com.example.aopdemo.iservice.ISysLogService.testAfterReturning1(..))")
    public void logTestAfterReturing2(){
        System.out.println("测试AfterReturing---value");
    }

3、value和pointcut参数效果一样,但当同时存在时,pointcut有效

    @AfterReturning(value = "testAfterReturing()")
    public void logTestAfterReturing3(){
        System.out.println("测试AfterReturing---value");
    }

4、returning能够将目标方法的返回值传到切面增强方法里

    // 声明rvt时指定的类型会限制目标方法必须返回指定类型(String)的值或没有返回值  
    // 此处将rvt的类型声明为Object,意味着对目标方法的返回值不加限制 
    @AfterReturning(pointcut = "testAfterReturing()",returning = "rvt")
    public void logTestAfterReturing4(String rvt){
        System.out.println("测试AfterReturning---returning:"+str);
    }

5、使用args,能够将目标方法的参数传到切面增强方法里

    @AfterReturning(value = "testAfterReturing()&& args(a,b)",argNames = "a,b")
    public void logTestAfterReturning4(String a,String b){
        System.out.println("测试AfterReturing---arg:a="+a+";b="+b);
    }
	//使用argNames,能够调整参数顺序,默认值为arg中顺序
    @AfterReturning(value = "testAfterReturing()&& args(a,b)",argNames = "b,a")
    public void logTestAfterReturning5(String b,String a){
        System.out.println("测试AfterReturing---arg and argNames:b="+b+";a="+a);
    }