AOP如何对⽅法⼊参和出参进⾏增强处理,看完你就懂了
⽬录
前⾔
很多时候,我们会需要对⽅法的⼊参或者出参进⾏⼀些额外的处理,这时候使⽤AOP可以很好的满⾜我们的需求。因为AOP的侵⼊性较低,与业务逻辑的代码耦合度低,并且有较好的可重⽤性,开发效率较⾼。
下⾯摘抄⼀些关于AOP的介绍
AOP意为⾯向切⾯编程,AOP是通过预编译⽅式和运⾏期动态代理实现在不修改源代码的情况下给程序动态统⼀添加功能的⼀种技术。AOP是OOP的延续,是软件开发中的⼀个热点,也是Spring框架中的⼀个重要内容,利⽤AOP可以对业务逻辑的各个部分进⾏隔离,从⽽使得业务逻辑各部分之间的耦合度降低,提⾼程序的可重⽤性,同时提⾼了开发的效率。
前提
在Spring Boot项⽬中使⽤aop,需要添加以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>springboot aop
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
AOP增强⼊参和出参
如果我们要对⼊参和出参进⾏增强处理,那么需要使⽤的是Around环绕增强。
下⾯简单介绍下Around环绕的作⽤
Around环绕增强作⽤:可以在⽬标⽅法执⾏前织⼊增强动作,也可以在⽅法执⾏后织⼊增强动作,可以决定⽬标⽅法在什么时候执⾏,如何执⾏。可以改变⽬标的⼊参和返回值。
看了Around环绕增强的作⽤,我们可以看到Around环绕增强很适合我们处理⽬标⽅法的⼊参和出参
下⾯我就演⽰下Around环绕增强⼊参和出参的基本⽤法,⼤家可以参考进⾏⾃⼰的处理
@Aspect//定义切⾯类
@Component
public class ControllerAspect {
/**
* 定义切点
*/
@Pointcut("execution(* ller.*.*(..))")
public void point(){
}
/**
* 定义环绕增强
*/
@Around("point()")
public Object around(ProceedingJoinPoint joinPoint)throws Throwable {
//获取⼊参
Object[] args = Args();
//获取⽅法名
System.out.Signature().getName());
//获取⽅法所在类的类名
System.out.Signature().getDeclaringType().getSimpleName());
//对⼊参进⾏处理
int i=0;
if(ArrayUtils.isNotEmpty(args)){
/
/⼊参为对象
Params params=null;
for(Object arg : args){
//String类型或者Integer等包装类,需要对⼊参数组进⾏重新赋值
if(arg instanceof String){
args[i]="aop处理后的⼊参";
}
//对象类型的⼊参直接修改属性即可
if(arg instanceof Params){
params=(Params) arg;
params.setName("aop处理后的⼊参对象");
}
i++;
}
}
//传⼊⼊参执⾏⽅法
Object response = joinPoint.proceed(args);
//修改返回值
if(response instanceof String){
response="修改后的返回值";
}
//将返回值返回,⽅法的返回值是around的返回值,⽽不是原来的返回值
return response;
}
}
下⾯概括下AOP修改⽅法⼊参和出参的⼤体过程
修改⼊参
1、通过ProceedingJoinPoint获取原来的⼊参
2、对原⼊参进⾏增强处理
3、将⼊参传⼊ProceedingJoinPoint的proceed,执⾏⽅法,这时候⽅法就相当于是⽤增强后的⼊参执⾏⽅法
修改出参
1、接收proceed⽅法的返回值,这就是⽅法初始的返回值
2、对初始返回值进⾏增强处理
3、返回增强后的返回值,被around环绕的⽅法,它的出参是around⽅法的返回值,⽽不⼀定是⽅法的原返回值,这就是我们能对返回值进⾏增强处理的本质
测试类:
@Controller
@RestController
public class TestController {
@PostMapping(value ="testAop")
public String testAop(String userName, Params params)throws Exception{
System.out.println("⼊参为: "+userName);
System.out.println("⼊参对象为: "+params);
return"正常返回值";
}
}
调⽤后输出:
testAop
TestController
⼊参为: aop处理后的⼊参
⼊参对象为:Params(name=aop处理后的⼊参对象)
修改后的返回值
通过结果,我们可以看到AOP已经对⽅法的⼊参和出参进⾏了处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论