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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具