Spring приложение имеет предупреждения Cglib2AopProxy

При запуске приложения я получаю множество предупреждений в строках 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 />. Есть ли что-нибудь, что я могу сделать, чтобы заставить замолчать эти предупреждения или, еще лучше, исключить эти классы из аспекта ткачества?

Ответ 1

Возможно, вы расширили JdbcDaoSupport и добавили аннотации @Transactional.

Вы можете установить логгером Cglib2AopProxy на уровень журнала ERROR, чтобы избежать сообщений о предупреждении. Например, если вы используете log4j и log4j.properties:

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR

Ответ 2

Это скорее всего вызвано аннотацией @Transactional, Spring обертывает ваш DAO в прокси, чтобы добавить транзакционное поведение.

Я бы рекомендовал, чтобы ваш DAO реализовал интерфейс (создать и использовать интерфейс для вашего DAO), это позволит Spring использовать динамический прокси JDK вместо использования CGLib.

Использование CGLIB ограничено тем, что методы, помеченные как final в целевом классе, могут быть рекомендованы, поскольку окончательные методы не могут быть переопределены (CGLIB создает подкласс целевого класса во время выполнения), но это ограничение исчезает в случае использования динамических прокси-серверов JDK.

Ссылка

Ответ 3

Вы должны использовать интерфейсы для внедрения зависимостей, большинство причин для этого описано здесь и здесь.

Вы можете прочитать документацию о механике прокси, чтобы узнать, почему вы видите это предупреждение.

И, пожалуйста, проголосуйте за особый запрос на проверку IntelliJ, который может помочь нам избежать этого предупреждения. Кстати, это также содержит хорошее объяснение.

Ответ 4

Spring Boot теперь использует прокси CGLIB по умолчанию, в том числе для поддержки AOP. Если вам нужен интерфейсный прокси, вам нужно установить в spring.aop.proxy-target-class значение false.

spring.aop.proxy-мишень класс = ложь