簡體   English   中英

如何在Spring中注入List實例?

[英]How can I inject an instance of List in Spring?

什么有效

假設我有一個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。 但是我實際上想要將List包裝到一個不可修改的List中,但只有將我的依賴項降級到列表才能實現。

到目前為止發現了解決方法

以下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? 怎么樣?

使用@Qualifier將使用給定的限定符注入bean。 您可以將要成為bean的列表命名為可以正常工作的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM