升级Spring 4.3.14后出现CglibAopProxy代理final方法警告求助
解决Spring 4.3.14升级后CglibAopProxy的final方法代理警告
这个警告我之前升级Spring版本时也碰到过,本质是CGLIB代理机制和Spring测试类里的final方法冲突了,给你几个可行的解决思路:
方案1:切换为JDK动态代理
警告里已经明确提示「Consider using interface-based JDK proxies instead」,具体配置分两种场景:
- XML配置:在
<aop:config>标签中添加proxy-target-class="false",或者在事务驱动标签<tx:annotation-driven>里设置同样属性; - 注解配置:在你的
@Configuration类上使用@EnableAspectJAutoProxy(proxyTargetClass = false)(如果用到了切面),或者对应事务、缓存的注解里将proxy-target-class设为false。
JDK代理基于接口实现,不会去代理类中的final方法,自然就能避开这个冲突。
方案2:调整测试类的继承逻辑
你的测试类应该是继承了AbstractJUnit4SpringContextTests,这个类把setApplicationContext方法标记成了final。其实你可以不用继承这个类,直接实现ApplicationContextAware接口自己处理上下文注入:
public class YourTestClass extends JUnit4TestRunner implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } // 你的测试方法... }
自定义的setApplicationContext不是final方法,CGLIB代理时就不会触发警告,而且功能和继承AbstractJUnit4SpringContextTests完全一致。
方案3:临时忽略警告(不推荐)
如果这个警告完全不影响测试运行,只是看着烦,可以通过日志框架调高该类的日志级别。比如用Logback的话,在logback.xml里添加:
<logger name="org.springframework.aop.framework.CglibAopProxy" level="ERROR"/>
不过这只是治标不治本的办法,还是优先推荐前两种方案。
补充说明
Spring 4.3.14应该是强化了CGLIB代理的验证逻辑,之前版本可能没输出这个警告,但问题其实一直存在——CGLIB通过生成子类实现代理,而final方法无法被子类覆盖,所以代理类无法处理这个方法,最终抛出警告。
内容的提问来源于stack exchange,提问作者user2624800
相关产品推荐
相关产品推荐

