通用自动装配不与@Transactional一起使用

时间:2016-05-31 22:43:47

标签: java spring generics autowired

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,这意味着BookStoreToyStore并且Spring无法决定需要哪一个。这告诉我,由于某些上游方法已被代理@Transactional,因此Spring无法再检测泛型类型。无论如何......这样的东西......

我想坚持使用接口,而不是使用@Qualifier。有没有办法用@Transactional执行此操作,还是已知限制泛型和自动装配以及@Transactional之类的内容?

1 个答案:

答案 0 :(得分:-1)

Spring默认使用JDK代理生成AOP中使用的代理。 JDK代理基于接口。所以它可能是问题,当你需要自动装配具体类时。所以请改用cglib(添加依赖关系)并设置&#34;&#34;在spring配置文件中&#34;&#34;并试一试。希望能帮助到你。 Using @Transaction annotation with @Autowired - Spring