持续创作,加速成长!这是我参与「掘金日新计划 · 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);
}