17

在启动我的应用程序时,我收到了许多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 />. 我能做些什么来消除这些警告,或者更好的是,将这些类从方面编织中排除?

4

4 回答 4

16

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

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

使用 CGLIB 有一个限制,即不能建议在目标类中标记为 final 的方法,因为最终方法不能被覆盖(CGLIB 在运行时创建目标类的子类),但是在使用 JDK 动态代理的情况下,这个限制就会消失。

参考

于 2012-10-02T19:49:06.813 回答
4

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

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

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR
于 2012-10-02T14:03:31.317 回答
1

Spring Boot 现在默认使用 CGLIB 代理,包括 AOP 支持。如果需要基于接口的代理,则需要将 spring.aop.proxy-target-class 设置为 false。

spring.aop.proxy-target-class=false

于 2019-04-29T09:13:07.897 回答
1

您应该使用接口进行依赖注入,这里这里描述了这样做的最主要原因。

您可以阅读有关代理机制的文档,详细了解您看到此警告的原因。

请投票支持IntelliJ 的功能检查请求,这可能有助于我们避免此警告。顺便说一句,它还包含一个很好的解释。

于 2015-09-22T11:49:23.160 回答