如何在Spring中注入List实例?

什么有效

假设我有一个ArrayList的spring bean定义:

     de en      

现在我可以将它注入各种bean中,例如:

 @Controller class Controller { @Autowired public Controller(ArrayList availableLanguages) { // ... } } 

这很好用。

怎么打破

但是,如果我稍微更改我的控制器并使用类型List而不是ArrayList如下所示:

 @Controller class Controller { @Autowired public Controller(List availableLanguages) { // ... } } 

然后我得到一个String类型的所有bean的列表,而不是我定义的bean。 但是我实际上想将List包装到一个不可修改的List中,但只有将我的依赖项降级到列表才能实现。

到目前为止发现了变通方法

以下XML文件:

      de en      

与此控制器一起使用:

 @Controller class Controller { @Autowired public Controller(Object availableLanguages) { List theList = (List)availableLanguages; } } 

虽然这个工作,额外的类型演员是丑陋的。

到目前为止的调查结果

我认为Spring 4.2.5(目前最新版本)中的集合有一个特殊处理,这似乎会造成所有麻烦。 当参数是扩展Collection的接口时,它会创建特殊行为。 因此,我可以通过使用Object或具体实现作为参数类型来解决。

有没有办法直接将列表注入bean? 怎么样?

使用@Qualifier将使用给定的限定符注入bean。 您可以将您想要成为bean的列表命名,并且可以正常工作。