8

クラスタイプを介して Bean を検索する必要があります。Bean が Proxy によってラップされている場合 (一部のメソッドは @Transactional です)、ApplicatoinContext はそれらを見つけることができません。インターフェイスを介してそれらを検索すると機能することがわかりましたが、この場合は具体的なクラス型で作業しています。Bean が探しているタイプであることはわかっていますが、getBean() メソッドが失敗します。

Spring の AbstractBeanFactory コードの問題をデバッグ (および修正) できます。問題は、私が要求しているタイプに対して beanInstance のタイプをチェックすることですが、beanInstance.getClass() はプロキシです。AbstractBeanFactory はこれを補正し、型をプロキシのターゲット クラスと比較する必要があります。

私はこれを修正しましたが、Spring のパッチを適用したバージョンを特に使用したくありません。これを機能させるために構成できるものがあるはずだと思いますか、それとも本当にバグですか?

4

2 に答える 2

14

SpringがAOPを実装する主な方法は2つあります(@Transactionalサポートなど)。プロキシインターフェイスまたはCGLIBを使用する方法です。

クラスがインターフェイスを実装している場合、インターフェイス(デフォルト)を使用すると、Springはそのすべてのインターフェイスを実装するプロキシを作成します。今後は、そのインターフェースを介してのみBeanを操作できます。あなたのクラスは彼らの中に深く埋もれています。

を介してターゲットクラスのプロキシを有効にした場合:

<aop:config proxy-target-class="true">

Springは代わりにサブクラスを作成します(明らかにまだすべてのインターフェースを実装しています)。これで問題が解決します。ただし、返されるオブジェクトは実際にはクラスではなく、元のオブジェクトにラップして委任する動的に生成されたサブクラスであることに注意してください。ほとんどの場合、これは問題にはなりません。

もちろん、これはバグではありませんが、よく知られている動作であり、Springにパッチを適用する必要はありません。

も参照してください

于 2012-07-18T06:45:30.383 に答える
1
<context:component-scan base-package="<Your base package name goes here>" />
<aop:aspectj-autoproxy />
<aop:config proxy-target-class="true"/>

これらの3行をapplicationContext.xmlに書いてください。これは私にとってはうまくいきました。

于 2012-07-18T12:16:42.063 に答える