知識庫 / Spring RSS 訂閱

Spring – 注入集合

Spring
HongKong
5
02:01 PM · Dec 06 ,2025

 

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 集合。

我們還研究了使用引用類型注入以及如何在集合中選擇或排序它們。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.