彈簧似乎完全能夠根據通用參數自動裝配正確的類型,而不需要@Qualifier
s。但是,只要我註冊@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()
的調用的上游方法,例如,將@Transactional
註釋添加到inventoryBooks()
。在調用它的客戶端方法上,BookDealer
將不再自動裝入,我必須訴諸注入具體類型或使用@Qualifier
。錯誤在於有BookDealer
的構造函數參數有兩個匹配的bean,這意味着BookStore
和ToyStore
和Spring都無法確定需要哪一個。這告訴我Spring現在已經不能檢測到泛型類型,因爲某些上游方法已被@Transactional
代理。類似的東西無論如何...
我想堅持接口,而不是使用@Qualifier
s。有沒有一種方法可以用@Transactional
來做到這一點,還是一種已知的泛型和自動裝配的限制以及諸如@Transactional
之類的東西?
您是否能夠確定泛型自動裝配爲什麼不能與@Transactional一起使用? –
我沒有,對不起。 – SingleShot
堅果...當前正在逐步通過GenericCollectionTypeResolver,ResolvableType,GenericTypeAwareAutowireCandidateResolver,以更好地理解幕後發生的情況。 –