2016-05-31 75 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