【问题标题】:How can I inject an instance of List in Spring?如何在 Spring 中注入 List 的实例?
【发布时间】:2016-07-06 12:45:08
【问题描述】:

什么有效

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

<bean id="availableLanguages" class="java.util.ArrayList">
    <constructor-arg>
        <bean class="java.util.Arrays" factory-method="asList">
            <constructor-arg>
                <list>
                    <value>de</value>
                    <value>en</value>
                </list>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

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

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

这很好用。

它是如何破坏的

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

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

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

到目前为止发现的解决方法

以下 XML 文件:

<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList">
    <constructor-arg>
        <bean class="java.util.Arrays" factory-method="asList">
            <constructor-arg>
                <list>
                    <value>de</value>
                    <value>en</value>
                </list>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

与这个控制器一起工作:

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

虽然这行得通,但额外的类型转换很丑。

目前的调查结果

我认为有一个special handling for collections in Spring 4.2.5 (the currently most recent version) 似乎会造成所有麻烦。当参数是扩展Collection 的接口时,它会创建特殊行为。因此,我可以通过使用Object 或具体实现作为参数类型来解决问题。

问题

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

【问题讨论】:

  • 您可以使用命名空间util。看看thisasnwer。
  • @josivan:据我所知,这会改变我定义列表的方式。然而,列表的定义不是问题。是注入导致了问题,还是我错过了 util 所做的任何事情?
  • util:list是Spring上下文中的常规bean,可以正常注入。我注意到您混合使用了 Annotation 和 XML,然后托盘在构造函数中使用 @Qualifier。例如@Qualifier("myList")
  • 我会使用像“LanguageList”这样的具体类型。我知道这不能回答你的问题,但它可能会解决你的问题。
  • 几天前我遇到了同样的问题。检查它:stackoverflow.com/questions/6267138/spring-autowire-a-list。使用@Resource 注释而不是@Autowired,它会找到bean 但它的名称,而不是y 类型。

标签: java spring spring-ioc


【解决方案1】:

使用@Qualifier 将注入具有给定限定符的bean。您可以命名您想成为 bean 的列表,这样就可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2016-11-29
    • 2011-01-06
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多