springboot动态代理的实现---JDK和cglib,解决aop使用getSignature().getParameterNames()获取参数名为null问题

问题描述:

springboot版本 1.5 ,使用aop中的环绕通知,代理service层的实现类,需要获取目标方法的参数名,正常使用pjp.getSignature().getParameterNames(),通过ProceedingJoinPoint这个对象获取目标方法的信息,但却发现获取的参数名数组一直是null

原因:

在springboot中生成代理对象有两种实现,一种是jdk原生的Proxy,这种方式需要目标类实现接口.
另一种是使用cglib来生成代理对象,这种方式不需要实现接口,原理是使用继承来实现,所以目标类不能是final类.
那么springboot是如何选择这两种方式的呢,如果要代理的对象实现了接口,springboot就会使用JDK原生的方式创建代理对象,如果代理对象没有实现接口则默认使用cglib生成dialing对象,而原生的jdk的代理对象,通过getParameterNames()是获取不到参数名的,我的service层的实现类恰好是实现了接口,是JDK的代理对象,所以获取的参数名为空.

解决:

我们可以指定实现接口的类也用cglib来实现代理.在配置文件中加上

spring.aop.proxy-target-class=true

指定代理对象生成的方式.
或者要代理对象不实现接口,单独写一个类似工具类的方法.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值