AOP(二)之AfterReturning增强处理

@AfterReturning

@AfterReturning可修饰AfterReturning增强处理,AfterReturning增强处理将在目标方法正常完成后被织入。

使用@AfterReturning注解可指定如下四个属性,一般使用前三个。

  • pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。
  • returing:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。除此之外,在Advice方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值。
  • argNames:

测试

实现类方法

@Override
public String testAfterReturning1(String a,String b) {
    System.out.println("testAfterReturning1执行了!!!");
    return a+b;
}

Controller

@GetMapping("/test4")
public String test4(){
	return logService.testAfterReturning1("aaa","bbb");
}

切面类

package com.example.aopdemo.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Component
@Aspect //指明一个切面
@Slf4j
public class LogAspect {

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

    @AfterReturning(pointcut = "testAfterReturing()")
    public void logTestAfterReturing(){
        System.out.println("测试AfterReturing---pointcut");
    }
    //可以直接使用切入表达式,指明切入点
    @AfterReturning(pointcut = "execution(* com.example.aopdemo.iservice.ISysLogService.testAfterReturning1(..))")
    public void logTestAfterReturing2(){
        System.out.println("测试AfterReturing---value");
    }
    //value和pointcut参数效果一样,但当同时存在时,pointcut有效
    @AfterReturning(value = "testAfterReturing()")
    public void logTestAfterReturing3(){
        System.out.println("测试AfterReturing---value");
    }

    //returning能够将目标方法的返回值传到切面增强方法里
    // 声明rvt时指定的类型会限制目标方法必须返回指定类型(String)的值或没有返回值  
    // 此处将rvt的类型声明为Object,意味着对目标方法的返回值不加限制 
    @AfterReturning(pointcut = "testAfterReturing()",returning = "rvt")
    public void logTestAfterReturing4(String rvt){
        System.out.println("测试AfterReturning---returning:"+str);
    }
	//使用arg,能够将目标方法的参数传到切面增强方法里
    @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);
    }
}

运行结果

testAfterReturning1执行了!!!
测试AfterReturing---pointcut
测试AfterReturing---value
测试AfterReturing---value
测试AfterReturning---returning:aaabbb
测试AfterReturing---arg:a=aaa;b=bbb
测试AfterReturing---arg and argNames:b=bbb;a=aaa
posted @   寒小韩  阅读(531)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示