Spring似乎完全能够基于通用参数自动装配正确的类型,而无需@Qualifier
s。但是,只要我使用@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
。错误是BookDealer
的构造函数参数有两个匹配的bean,这意味着BookStore
和ToyStore
并且Spring无法决定需要哪一个。这告诉我,由于某些上游方法已被代理@Transactional
,因此Spring无法再检测泛型类型。无论如何......这样的东西......
我想坚持使用接口,而不是使用@Qualifier
。有没有办法用@Transactional
执行此操作,还是已知限制泛型和自动装配以及@Transactional
之类的内容?
答案 0 :(得分:-1)
Spring默认使用JDK代理生成AOP中使用的代理。 JDK代理基于接口。所以它可能是问题,当你需要自动装配具体类时。所以请改用cglib(添加依赖关系)并设置&#34;&#34;在spring配置文件中&#34;&#34;并试一试。希望能帮助到你。 Using @Transaction annotation with @Autowired - Spring