今天,这个问题纠结了一天,一直记得有次demo里在控制器使用自定义AOP报错问题.单平时用用也没事呀,可这错误印象是妥妥的,纠结了半天,一直回忆查资料
结果就是这个原因
Spring 5.x中AOP默认依旧使用JDK动态代理
SpringBoot 2.x开始,为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB。
在SpringBoot 2.x中,如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxyTargetClass配置已无效。
控制器没有实现接口
下面是SpringBoot配置文件 默认是true
下面是一个Spring框架项目自己以前学习时候的笔记
那么就对了 如果只是用Spring框架而没有用SpringBoot默认的是JDK代理
而JDK代理需要目标对象与代理对象实现同一个接口,而控制器我们没有实现接口,导致无法代理
强迫症犯了
JDK代理:
要求:目标对象必须实现接口
代理对象也必须实现目标对象的接口
目标对象/代理关系:目标对象与代理对象兄弟关系
CGLIB代理:
要求:不管目标对象是否有接口,都可以为其创建代理对象
代理要求:要求代理对象必须继承目标对象
目标对象/代理关系:目标对象与代理对象是父子关系
CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;
但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;