5

什么有效

假设我有一个 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) {
        // ...
    }
}

然后,我得到了所有类型的 bean 的列表,String而不是我定义的 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;
    }
}

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

迄今为止的发现

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

问题

有什么方法可以直接将列表注入到 bean 中?如何?

4

1 回答 1

0

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

于 2017-02-01T12:57:01.957 回答