2016-05-31 87 views
1

彈簧似乎完全能夠根據通用參數自動裝配正確的類型,而不需要@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,這意味着BookStoreToyStore和Spring都無法確定需要哪一個。這告訴我Spring現在已經不能檢測到泛型類型,因爲某些上游方法已被@Transactional代理。類似的東西無論如何...

我想堅持接口,而不是使用@Qualifier s。有沒有一種方法可以用@Transactional來做到這一點,還是一種已知的泛型和自動裝配的限制以及諸如@Transactional之類的東西?

+0

您是否能夠確定泛型自動裝配爲什麼不能與@Transactional一起使用? –

+0

我沒有,對不起。 – SingleShot

+0

堅果...當前正在逐步通過GenericCollectionTypeResolver,ResolvableType,GenericTypeAwareAutowireCandidateResolver,以更好地理解幕後發生的情況。 –

回答

-1

Spring使用JDK Proxy來默認生成AOP中使用的代理。 JDK代理基於接口。所以這可能是問題,當你需要自動裝配具體的課程。因此,改用cglib(添加denpendency)並將spring配置文件中的「」設置爲「」並嘗試一下。希望能幫助到你。 Using @Transaction annotation with @Autowired - Spring