@Cacheableを使用して作成されたAOPプロキシがSpring3.1.1の依存性注入を壊すケースに遭遇しました。これが私のシナリオです:
実装されたメソッドで@Cacheableを使用してこのインターフェイスを実装するインターフェイスとクラスがあります。
インターフェースの例:
public interface ImgService {
public byte[] getImage(String name);
}
実装例:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
また、JUnitテストクラスも必要です。1つはインターフェイスを挿入し、もう1つは実装です。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
と
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
インターフェイスの依存性注入は正常に機能します。ただし、2番目のテストクラスに実装を挿入すると、「自動配線された依存関係の挿入に失敗しました」というメッセージが表示されます。デバッグできましたが、ClassUtils.isAssignableValue()が目的のタイプをプロキシクラスと誤って比較しているようです。DefaultListableBeanFactoryによって呼び出されます。さらに奇妙なことに、実装されたメソッドから@Cacheableアノテーションを削除し、それを他の保護された/プライベートなメソッドに追加すると、依存性注入が再び正常に機能します。これはバグですか?この状況を処理するための正しいアプローチは何でしょうか?