java - 如何在 Spring 中注入(inject)一个 List 实例?

标签 java spring spring-ioc

什么有效

假设我有一个 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>

现在我可以将其注入(inject)各种 bean,例如像这样:

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

效果很好。

它是如何破裂的

但是,如果我稍微更改我的 Controller 并使用类型 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 一起工作:

@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 的接口(interface)时,它会创建特殊行为。因此,我可以通过使用 Object 或具体实现作为参数类型来解决问题。

问题

有什么方法可以直接将一个列表注入(inject)到一个bean中吗?怎么办?

最佳答案

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

关于java - 如何在 Spring 中注入(inject)一个 List 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106804/

相关文章:

java - SparkJava的awaitStop()方法立即返回,即使在初始化之后也是如此,但stop()尚未被调用

java - 如何保留其他属性的 'tally'作为自己的类属性

java - Spring的事件模型

java - 在 Spring Rest 模板中设置超时

spring - 用NEW创建的spring bean真的是单例吗

java - 将 MessageSource 注入(inject) Enum

java - 如何获取维基词典页面的 Html 源?

java - Actuator Health Endpoint 返回 OUT_OF_SERVICE,当所有组都启动时

Spring MVC 2.5 使用注释和 XML 配置的混合,但 xml 被忽略

spring - 如何从 Actuator/metrics 端点中排除 Hystrix Metrics?