@Qualifier
を必要とせずに、汎用のパラメータに基づいて正しいタイプのオートワイヤリングが可能です。しかし、私は@Transactional
注釈を付けるとすぐに、一般的なパラメータに基づいてオートワイヤリングすることはできません。問題を説明する目的でのみ作成されたこの例を考えてみましょう。@Transactionalで動作しない汎用オートワイヤリング
interface Product {}
interface Book extends Product {}
interface Toy extends Product {}
interface Store<P extends Product> {}
@Component
class BookStore implements Store<Book> {}
@Component
class ToyStore implements Store<Toy> {}
@Component
class BookDealer {
@Autowired
BookDealer(Store<Book> store) {
...
}
void inventoryBooks() {
... doesn't really matter what this does ...
}
}
上記のコードは正常に機能します。 BookStore
クラスは、問題なしでBookDealer
コンストラクタにオートワイヤードされています。私はinventoryBooks()
と呼ぶことができ、それは正常に動作します。
ただし、@Transactional
アノテーションをinventoryBooks()
へのコールの上流のメソッドに追加すると、それを呼び出すクライアントメソッドでは、BookDealer
はもはやオートワイヤではなくなり、具体的な型を注入するか、@Qualifier
を使用する必要があります。エラーは、コンストラクタ引数に一致する2つのBeanがBookDealer
であることです。つまり、BookStore
との両方を意味し、Springはどちらが必要かを判断できません。これは、Springが@Transactional
のいくつかのアップストリームメソッドがプロキシされているので、Springがジェネリック型を検出できなくなったことを示しています。とにかくそのようなもの...
私はインターフェイスに固執したいと思います。@Qualifier
を使用しません。 @Transactional
でこれを行う方法はありますか、またはそれはgenericsとautowiringの既知の制限で、@Transactional
のようなものですか?
ジェネリックautowiringが@Transactionalで動作しなかった理由を知ることができましたか? –
私はしなかった、申し訳ありません。 – SingleShot
ナッツ...現在、舞台裏で起こっていることをよりよく理解するために、GenericCollectionTypeResolver、ResolvableType、GenericTypeAwareAutowireCandidateResolverをステップ実行します。 –