web-dev-qa-db-ja.com

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.'の行に沿って、約12個ほどの関数に対して多数の警告が表示されます。

今では、プロキシベースの側面を最終的なメソッドに適用できないことを完全に理解しています。ただし、(少なくとも意図的に)JdbcDaoSupportにアスペクトを織り込もうとはしませんでした。 <tx:annotation-driven />から来ているのではないかと思います。これらの警告を黙らせるために、またはもっと良いことに、織りの側面からそれらのクラスを除外するために私ができることはありますか?

16
Michael Piefel

JdbcDaoSupportを拡張し、@Transactionalアノテーションを追加した可能性があります。

警告メッセージを回避するために、Cglib2AopProxyロガーをログレベルERRORに設定できます。たとえば、log4jとlog4j.propertiesを使用する場合:

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

これはおそらく@Transactionalアノテーションが原因で、SpringはDAOをプロキシでラップしてトランザクション動作を追加します。

DAOにインターフェースを実装させることをお勧めします(DAOのインターフェースを作成して使用します)。これにより、Springは代わりにJDK動的プロキシを使用できるようになります。 CGLibを使用する必要があります。

CGLIBを使用すると、finalメソッドをオーバーライドできないため(CGLIBは実行時にターゲットクラスのサブクラスを作成するため)、ターゲットクラスでfinalとしてマークされたメソッドにアドバイスできないという制限がありますが、JDK動的プロキシを使用する場合はこの制限はなくなります。

参照

16
Adolfo

Spring Bootは、AOPサポートを含め、デフォルトでCGLIBプロキシを使用するようになりました。インターフェイスベースのプロキシが必要な場合は、spring.aop.proxy-target-classをfalseに設定する必要があります。

spring.aop.proxy-target-class = false

1
Srinivas G

依存性注入にはインターフェースを使用する必要があります。これのほとんどの理由は ここ および ここ で説明されています。

この警告が表示される理由の詳細については、 代理整備士に関するドキュメント をお読みください。

そして、 IntelliJの検査の機能要求 に投票してください。これは、この警告を回避するのに役立つ可能性があります。ところでそれはまた良い説明が含まれています。

1