1. 簡介
在本教程中,我們將演示如何使用 Spring 框架注入 Java 集合。
簡單來説,我們將提供使用 List、Map、Set 集合接口的示例。
2. 使用 @Autowired 注入列表
讓我們創建一個示例 Bean:
public class CollectionsBean {
@Autowired
private List<String> nameList;
public void printNameList() {
System.out.println(nameList);
}
}在這裏,我們聲明瞭nameList屬性,用於存儲一個List包含String值的集合。
在此示例中,我們使用字段注入來獲取nameList。因此,我們添加了@Autowired註解。
要了解更多關於依賴注入或不同實現方式的信息,請查看此指南。
之後,我們在配置設置類中註冊了CollectionsBean。
@Configuration
public class CollectionConfig {
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean();
}
@Bean
public List<String> nameList() {
return Arrays.asList("John", "Adam", "Harry");
}
}除了註冊 CollectionsBean,我們還通過顯式初始化並將其作為單獨的 @Bean 配置返回注入一個新的列表。
現在,我們可以測試結果:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class);
CollectionsBean collectionsBean = context.getBean(
CollectionsBean.class);
collectionsBean.printNameList();printNameList() 方法的輸出:
[John, Adam, Harry]3. 使用構造器注入的 <emSet 集合
為了設置相同的示例,使用 <emSet 集合,讓我們修改 <emCollectionsBean 類:
public class CollectionsBean {
private Set<String> mySet;
public CollectionsBean() {
this.mySet = new HashSet<>();
}
public CollectionsBean(Collection<String> initialValues) {
this.mySet = new HashSet<>(initialValues);
}
// ... 其他代碼 ...
}
public class CollectionsBean {
private Set<String> nameSet;
public CollectionsBean(Set<String> strings) {
this.nameSet = strings;
}
public void printNameSet() {
System.out.println(nameSet);
}
}現在,我們想使用構造函數注入來初始化 nameSet 屬性。 這也需要對配置類進行更改。
@Bean
public CollectionsBean getCollectionsBean() {
return new CollectionsBean(new HashSet<>(Arrays.asList("John", "Adam", "Harry")));
}4. 使用 Setter 注入 Map
遵循相同的邏輯,讓我們添加 <em nameMap 字段來演示 Map 注入:
public class CollectionsBean {
private Map<Integer, String> nameMap;
@Autowired
public void setNameMap(Map<Integer, String> nameMap) {
this.nameMap = nameMap;
}
public void printNameMap() {
System.out.println(nameMap);
}
}本次我們提供了一個 setter 方法,以便使用 setter 依賴注入。 此外,還需要在配置類中添加 Map 初始化代碼:
@Bean
public Map<Integer, String> nameMap(){
Map<Integer, String> nameMap = new HashMap<>();
nameMap.put(1, "John");
nameMap.put(2, "Adam");
nameMap.put(3, "Harry");
return nameMap;
}<p>調用 <em >printNameMap()</em> 方法後得到的結果:</p>
{1=John, 2=Adam, 3=Harry}5. 注入 Bean 引用
下面我們來看一個注入 Bean 引用作為集合元素的示例。
首先,讓我們創建 Bean:
public class BaeldungBean {
private String name;
// constructor
}並添加一個 List 作為屬性到 CollectionsBean 類中:
public class CollectionsBean {
@Autowired(required = false)
private List<BaeldungBean> beanList;
public void printBeanList() {
System.out.println(beanList);
}
}接下來,我們為每個 BaeldungBean 元素添加 Java 配置工廠方法:
@Configuration
public class CollectionConfig {
@Bean
public BaeldungBean getElement() {
return new BaeldungBean("John");
}
@Bean
public BaeldungBean getAnotherElement() {
return new BaeldungBean("Adam");
}
@Bean
public BaeldungBean getOneMoreElement() {
return new BaeldungBean("Harry");
}
// other factory methods
}Spring 容器將類型為 BaeldungBean 的單個 Bean 注入到一個集合中。
為了測試這一點,我們調用 collectionsBean.printBeanList() 方法。輸出顯示 Bean 名稱作為列表元素:
[John, Harry, Adam]現在,讓我們考慮一下當沒有 BaeldungBean 的情況。如果應用程序上下文中沒有註冊 BaeldungBean,Spring 會拋出異常,因為缺少所需的依賴。
我們可以使用 @Autowired(required = false) 來標記依賴項為可選的。而不是拋出異常,beanList 不會被初始化,並且其值將保持 null。
如果我們需要一個空列表而不是 null,我們可以使用一個新的 ArrayList 初始化 beanList:
@Autowired(required = false)
private List<BaeldungBean> beanList = new ArrayList<>();5.1. 使用 @Order 對 Bean 進行排序
我們可以指定 Bean 在注入到集合中的順序。
為此,我們使用 @Order 註解並指定索引:
@Configuration
public class CollectionConfig {
@Bean
@Order(2)
public BaeldungBean getElement() {
return new BaeldungBean("John");
}
@Bean
@Order(3)
public BaeldungBean getAnotherElement() {
return new BaeldungBean("Adam");
}
@Bean
@Order(1)
public BaeldungBean getOneMoreElement() {
return new BaeldungBean("Harry");
}
}Spring 容器首先會注入名為 “Harry” 的 Bean,因為它具有最低的優先級。
然後,它會注入 “John” Bean,最後是 “Adam” Bean:
[Harry, John, Adam]更多關於 @Order 的信息請參見本指南。
5.2. 使用 @Qualifier 選擇 Bean
我們可以使用 @Qualifier 來選擇用於注入到與 @Qualifier 名稱匹配的特定集合的 Bean。
以下是如何在注入點中使用它:
@Autowired
@Qualifier("CollectionsBean")
private List<BaeldungBean> beanList;然後,我們使用相同的 @Qualifier</em/> 標記我們想要注入到 List</em/> 中的 Bean:
@Configuration
public class CollectionConfig {
@Bean
@Qualifier("CollectionsBean")
public BaeldungBean getElement() {
return new BaeldungBean("John");
}
@Bean
public BaeldungBean getAnotherElement() {
return new BaeldungBean("Adam");
}
@Bean
public BaeldungBean getOneMoreElement() {
return new BaeldungBean("Harry");
}
// other factory methods
}在此示例中,我們指定名稱為 “John” 的 Bean 將被注入到名為 “CollectionsBean” 的 List 中。 以下是我們測試的結果:
ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class);
CollectionsBean collectionsBean = context.getBean(CollectionsBean.class);
collectionsBean.printBeanList();從輸出結果中,我們看到我們的集合僅包含一個元素:
[John]6. 設置空列表作為默認值
我們可以使用 Collections.emptyList() 靜態方法,將注入的 List 屬性的默認值設置為一個空列表:
public class CollectionsBean {
@Value("${names.list:}#{T(java.util.Collections).emptyList()}")
private List<String> nameListWithDefaultValue;
public void printNameListWithDefaults() {
System.out.println(nameListWithDefaultValue);
}
}如果使用“names.list”鍵未通過屬性文件進行初始化,則運行如下:
collectionsBean.printNameListWithDefaults();我們將會得到一個空列表作為輸出:
[ ]7. 總結
通過本指南,我們學習瞭如何使用 Spring 框架注入不同類型的 Java 集合。
我們還研究了使用引用類型注入以及如何在集合中選擇或排序它們。