弹簧似乎完全能够根据通用参数自动装配正确的类型,而不需要@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,以更好地理解幕后发生的情况。 –