Spring应用程序有Cglib2AopProxy警告

Mic*_*fel 16 spring spring-aop spring-transactions

在开始我的应用程序时,我会收到大量警告o.s.aop.framework.Cglib2AopProxy 'Unable to proxy method [public final void org.springframework.jdbc.core.support.JdbcDaoSupport.setDataSource(javax.sql.DataSource)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.',大约有十几个功能.

现在我完全理解基于代理的方面不能应用于最终方法.但是,我没有(至少是故意的)尝试编织任何方面JdbcDaoSupport.我怀疑它来自<tx:annotation-driven />.我能做些什么来消除这些警告,或者更好的是,将这些类别排除在编织方面?

Ado*_*lfo 16

这很可能是由@Transactional注释引起的,Spring将DAO包装在代理中以添加事务行为.

我建议让你的DAO实现一个接口(为你的DAO创建和使用一个接口),这将允许Spring使用JDK动态代理而不必使用CGLib.

使用CGLIB有一个限制,即无法建议在目标类中标记为final的方法,因为无法覆盖最终方法(CGLIB在运行时创建目标类的子类),但在使用JDK动态代理的情况下,此限制将消失.

参考

  • 如问题中所述,我非常清楚代理问题.但是,我不在任何地方使用`JdbcDaoSupport`.我的所有存储库(保存一个)都使用Spring Data,因此无论如何都必须是接口.我必须研究剩下的一个是罪魁祸首或Spring Data本身,还是扩展其中一个的自定义实现. (2认同)

Jos*_*tin 4

也许您已经扩展JdbcDaoSupport并添加了@Transactional注释。

您可以将Cglib2AopProxy记录器设置为日志级别 ERROR 以避免出现警告消息。例如,如果使用 log4j 和 log4j.properties:

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR
Run Code Online (Sandbox Code Playgroud)

  • 以这种方式沉默,有点太不具体了。警告本身可能很有帮助。 (7认同)