问题描述:
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
指定代理对象生成的方式.
或者要代理对象不实现接口,单独写一个类似工具类的方法.