一、問題
在spring實踐bean注入ArrayList屬性的時候報錯:
Property of ‘java.util.ArrayList’ type cannot be injected by ‘List’
二、原因分析
在嘗試將 Spring 配置中的 注入到一個 ArrayList 類型的屬性時出現了類型不匹配問題。核心問題在于:Spring 的 標簽創建的是 java.util.LinkedList,而屬性聲明為 java.util.ArrayList。雖然兩者都實現了 List 接口,但它們是不同的具體實現類。
<property name="al"><list> <!-- Spring 默認創建的是 LinkedList --><value>test</value><value>9999</value></list>
</property>
在java類中:
private ArrayList al; // ArrayList 類型
三、解決方案
方案1:修改屬性類型為 List 接口(推薦)
// 修改前
private ArrayList al;// 修改后(使用接口類型)
private List al; // 或 List<String> 如果有泛型,記得set方法傳參類型也要改
優點:符合面向接口編程原則,兼容 Spring 的 標簽(它返回 LinkedList)。
方案 2:在 Spring 配置中顯式指定 ArrayList
<property name="al"><!-- 使用 value-type 指定元素類型 --><bean class="java.util.ArrayList"><constructor-arg><list value-type="java.lang.String"><value>fjd</value><value>9999</value></list></constructor-arg></bean>
</property>
方案 3:使用 util 命名空間(需要添加 schema)
在 XML 頭部添加 util 命名空間:
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"
配置 ArrayList:
<util:list id="myList" value-type="java.lang.String" list-class="java.util.ArrayList"><value>test</value><value>9999</value>
</util:list><bean id="bookDao" class="com.fjd.dao.impl.BookDaoImpl"><property name="al" ref="myList"/>
</bean>
四、總結
-
類型兼容性:
- list標簽 默認創建 LinkedList
- 聲明為 ArrayList 會導致類型不匹配
-
最佳實踐:
// 推薦:使用接口類型
private List<String> values;// 不推薦:使用具體實現類
private ArrayList<String> values; // 可能導致注入問題
-
泛型考慮:
- 如果列表中混合類型(如字符串和數字),確保屬性聲明為無泛型或 List<類型>
否則可能引發類型轉換異常
- 如果列表中混合類型(如字符串和數字),確保屬性聲明為無泛型或 List<類型>