知識庫 / Spring RSS 訂閱

將資源加載為字符串(Spring)

Spring
HongKong
4
01:22 PM · Dec 06 ,2025

1. 概述

本教程將探討各種將包含文本的資源(以字符串形式)的內容注入到 Spring 託管 Bean 中的方法。

我們將查看如何定位資源並讀取其內容。

此外,我們將演示如何將加載的資源在多個 Bean 之間共享。 這將通過使用與依賴注入相關的註解來實現,但同樣也可以通過使用基於 XML 的注入方式以及在 XML 屬性文件中聲明 Bean 來實現。

2. 使用 Resource

我們可以通過使用 Resource 接口來簡化定位資源文件的過程。Spring 幫助我們使用資源加載器查找和讀取資源,加載器會根據提供的路徑選擇合適的 Resource 實現。 Resource 實際上是一種訪問資源內容的方式,而不是資源本身。

下面是一些獲取 classpath 上的 Resource 實例的方法。

2.1. 使用 ResourceLoader

我們可以使用 ResourceLoader 類,如果希望使用延遲加載:

ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("classpath:resource.txt");

我們也可以使用 ResourceLoader 注射到我們的 Bean 中,使用 @Autowired

@Autowired
private ResourceLoader resourceLoader;

2.2. 使用 @Value

我們可以使用 @Value 註解將 Resource 直接注入到 Spring Bean 中。

@Value("classpath:resource.txt")
private Resource resource;

3. 將 資源 轉換為 字符串

一旦我們獲得了 資源,就需要將其讀取為一個 字符串。 讓我們創建一個名為 ResourceReader 的實用類,其中包含一個靜態方法 asString 來完成此操作。

首先,我們需要獲取一個 InputStream

InputStream inputStream = resource.getInputStream();

我們的下一步是使用這個 InputStream 並將其轉換為 String。我們可以使用 Spring 自己的 FileCopyUtils#copyToString 方法:

public class ResourceReader {

    public static String asString(Resource resource) {
        try (Reader reader = new InputStreamReader(resource.getInputStream(), UTF_8)) {
            return FileCopyUtils.copyToString(reader);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    // more utility methods
}

還有許多其他實現相同的方法,例如使用 copyToString 方法,該方法來自 Spring 的 StreamUtils 類。

我們還將創建一個其他實用方法 readFileToString,它將檢索指定路徑的 Resource 對象,並調用 asString 方法將其轉換為 String

public static String readFileToString(String path) {
    ResourceLoader resourceLoader = new DefaultResourceLoader();
    Resource resource = resourceLoader.getResource(path);
    return asString(resource);
}

4. 添加 配置

如果每個 Bean 都必須單獨注入資源 String,則可能導致代碼重複以及 Bean 擁有自身獨立 String 副本,從而增加內存使用。

為了實現更簡潔的解決方案,我們可以將資源的 內容注入到 하나或多個 Spring Bean 上,在加載應用程序上下文時。 這樣,各個需要使用該內容 Bean 就可以隱藏讀取資源的具體實現細節。

@Configuration
public class LoadResourceConfig {

    // Bean Declarations
}

4.1. 使用持有資源字符串的 Bean

讓我們在 @Configuration 類中聲明 Bean,用於持有資源內容:

@Bean
public String resourceString() {
    return ResourceReader.readFileToString("resource.txt");
}

現在,讓我們通過添加 @Autowired</em/> 註解,將已註冊的 Bean 注入到字段中。

public class LoadResourceAsStringIntegrationTest {
    private static final String EXPECTED_RESOURCE_VALUE = "...";  // The string value of the file content

    @Autowired
    @Qualifier("resourceString")
    private String resourceString;

    @Test
    public void givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect() {
        assertEquals(EXPECTED_RESOURCE_VALUE, resourceString);
    }
}

在這種情況下,我們使用 @Qualifier 註解和 Bean 的名稱,因為我們可能需要注入相同類型的多個字段——String

請注意,用於 Qualifier 的 Bean 名稱來源於配置類中創建 Bean 的方法的名稱。

5. 使用 SpEL

最後,讓我們看看如何使用 Spring 表達式語言來描述將資源文件直接加載到類中字段所需的代碼。

讓我們使用 @Value 註解將文件內容注入到字段 resourceStringUsingSpel 中:

public class LoadResourceAsStringIntegrationTest {
    private static final String EXPECTED_RESOURCE_VALUE = "..."; // The string value of the file content

    @Value(
      "#{T(com.baeldung.loadresourceasstring.ResourceReader).readFileToString('classpath:resource.txt')}"
    )
    private String resourceStringUsingSpel;

    @Test
    public void givenUsingSpel_whenConvertingAResourceToAString_thenCorrect() {
        assertEquals(EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel);
    }
}

我們這裏調用了 ResourceReader#readFileToString 方法,通過在 @Value 註解中使用以 “classpath:” – 開頭的路徑來確定文件的位置。

為了減少 SpEL 中代碼量,我們在 ResourceReader 類中創建了一個輔助方法,它使用 Apache Commons FileUtils 從提供的路徑訪問文件。

public class ResourceReader {
    public static String readFileToString(String path) throws IOException {
        return FileUtils.readFileToString(ResourceUtils.getFile(path), StandardCharsets.UTF_8);
    }
}

6. 結論

在本教程中,我們回顧了將資源轉換為 String 的幾種方法。

首先,我們看到了如何通過 Resource 訪問文件,以及如何從 Resource 讀取到 String

接下來,我們還展示瞭如何隱藏資源加載的實現,並允許字符串內容在 Bean 之間共享,通過在 @Configuration 中創建合格 Bean,從而實現字符串的自動注入。

最後,我們使用了 SpEL,它提供了一個緊湊且即時的解決方案,儘管它需要自定義的輔助函數來防止其變得過於複雜。

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

發佈 評論

Some HTML is okay.