Рубрики
Без рубрики

Загрузите ресурс в виде строки весной

Узнайте, как ввести содержимое файла ресурсов в наши компоненты в виде строки, а класс ресурсов Spring делает это очень простым.

Автор оригинала: Caroline Sciberras.

1. Обзор

В этом уроке мы рассмотрим различные способы введения содержимого ресурса, содержащего текст в виде строки, в наши компоненты Spring .

Мы рассмотрим поиск ресурса и чтение его содержимого.

Кроме того, мы продемонстрируем, как разделить загруженные ресурсы между несколькими компонентами. Мы покажем это с помощью аннотаций , связанных с внедрением зависимостей, хотя то же самое можно сделать и с помощью внедрения на основе XML и объявления компонентов в файле свойств XML.

2. Использование ресурсов

Мы можем упростить поиск файла ресурсов с помощью интерфейса Resource . Spring помогает нам найти и прочитать ресурс с помощью resourceloader, который решает, какую реализацию Resource выбрать в зависимости от предоставленного пути. Ресурс фактически является способом доступа к содержимому ресурса, а не к самому содержимому.

Давайте рассмотрим некоторые способы получения экземпляра ресурса для ресурсов в пути к классу .

2.1. Использование ResourceLoader

Мы можем использовать класс ResourceLoader , если мы предпочитаем использовать ленивую загрузку:

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

Мы также можем ввести ResourceLoader в наш боб с помощью @Autowired :

@Autowired
private ResourceLoader resourceLoader;

2.2 Использование @Resource

Мы можем ввести Ресурс непосредственно в Spring bean с @Value :

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

3. Преобразование из ресурса в строку

Как только у нас будет доступ к Ресурсу , мы должны иметь возможность прочитать его в Строку . Давайте создадим ResourceReader служебный класс со статическим методом asString , чтобы сделать это за нас.

Во-первых, мы должны получить InputStream :

InputStream inputStream = resource.getInputStream();

Наш следующий шаг-взять этот InputStream и преобразовать его в Строку . Мы можем использовать собственный метод 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, который будет извлекать Ресурс для пути и вызывать метод asString , чтобы преобразовать его в Строку .

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

4. Добавление класса конфигурации

Если бы каждый компонент должен был вводить ресурс String s индивидуально, есть вероятность как дублирования кода, так и большего использования памяти компонентами, имеющими свою собственную индивидуальную копию String .

Мы можем достичь более точного решения, введя содержимое ресурса в один или несколько компонентов Spring при загрузке контекста приложения. Таким образом, мы можем скрыть детали реализации для чтения ресурса от различных компонентов, которые должны использовать этот контент.

@Configuration
public class LoadResourceConfig {

    // Bean Declarations
}

4.1. Использование компонента, содержащего строку ресурса

Давайте объявим бобы для хранения содержимого ресурса в классе @Configuration :

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

Теперь давайте добавим зарегистрированные бобы в поля, добавив аннотацию @Autowired:

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);
    }
}

В этом случае мы используем @Квалификатор аннотацию и имя компонента, так как нам может потребоваться ввести несколько полей одного и того же типаString .

Следует отметить, что имя компонента, используемое в квалификаторе, является производным от имени метода, который создает компонент в классе конфигурации.

5. Использование заклинания

Наконец, давайте посмотрим, как мы можем использовать язык выражений Spring для описания кода, необходимого для загрузки файла ресурсов непосредственно в поле в нашем классе.

Давайте используем аннотацию @Value , чтобы ввести содержимое файла в строку поля ресурса с помощью Spel :

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 , описав расположение файла с помощью “classpath:” – путь с префиксом внутри нашей @Value аннотации.

Чтобы уменьшить объем кода в заклинании, мы создали вспомогательный метод в классе 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. Заключение

В этом уроке мы рассмотрели некоторые способы преобразования ресурса в Строку .

Прежде всего, мы увидели, как создать Ресурс для доступа к файлу и как читать из Ресурса в строку.

Затем мы также показали, как скрыть реализацию загрузки ресурсов и разрешить совместное использование содержимого строк между компонентами, создав квалифицированные компоненты в @Configuration , что позволяет автоматически подключать строки.

Наконец, мы использовали Spell, который обеспечивает компактное и немедленное решение, хотя для этого требовалась специальная вспомогательная функция, чтобы она не стала слишком сложной.

Как всегда, код для примеров можно найти на GitHub