Spring Series 8: Чтение файлов в Spring — ResourceLoaderAware

Spring
Spring Series 8: Чтение файлов в Spring — ResourceLoaderAware

Перекрывая слезы и парчовые персонажи, жизнь состоит только из любви и тяжелой смерти.

Обзор

В этой статье вы узнаете о ресурсах или файлах (таких как текстовые файлы,XML-файл, файл свойств или файл изображения) вSpringРазличные реализации в контексте приложения.Spring ResourceLoaderдает нам единыйgetResource()метод для получения внешних ресурсов по пути к ресурсу.

ресурс(Resource)интерфейс

ResourceдаSpringОбщий интерфейс для представления внешних ресурсов в формате .

SpringзаResourceИнтерфейс предоставляет следующие 6 реализаций.

  1. UrlResource
  2. ClassPathResource
  3. FileSystemResource
  4. ServletContextResource
  5. InputStreamResource
  6. ByteArrayResource

Мы можем указать разные префиксы для создания путей для загрузки ресурсов из разных мест.

префикс Пример иллюстрировать
classpath: classpath:com/myapp/config.xml Загрузить из пути к классам
file: file:///data/config.xml из файловой системы какURLнагрузка.
http: https://myserver/logo.png отURLнагрузка
(none) /data/config.xml зависит от лежащего в основеApplicationContext

ResourceLoader

Он используется для загрузки ресурсов (таких как путь к классам или ресурсы файловой системы). Он имеет два метода:

//Expose the ClassLoader used by this ResourceLoader.
ClassLoader getClassLoader()
 
//Return a Resource handle for the specified resource location.
Resource getResource(String location)

getResource()Метод решит, какой экземпляр создать на основе пути к ресурсу.Resourceвыполнить. получитьResourceLoader, пожалуйста, реализуйтеResourceLoaderAwareинтерфейс.

Resource banner = resourceLoader.getResource("file:c:/temp/filesystemdata.txt");

использоватьApplicationContextресурс загрузки

существуетSpring, все контексты приложения реализуютResourceLoaderинтерфейс. Следовательно, все контексты приложения могут использоваться для получения экземпляров ресурсов.

получитьApplicationContext, пожалуйста, реализуйтеApplicationContextAwareинтерфейс.

Resource banner = ctx.getResource("file:c:/temp/filesystemdata.txt");

использоватьResourceLoaderAwareресурс загрузки

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

CustomResourceLoader.javaзаписывается следующим образом, он выводит в консоль содержимое загруженного файла ресурсов.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
 
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
 
public class CustomResourceLoader implements ResourceLoaderAware
{
    private ResourceLoader resourceLoader;
 
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
 
    public void showResourceData() throws IOException
    {
        //This line will be changed for all versions of other examples
        Resource banner = resourceLoader.getResource("file:c:/temp/filesystemdata.txt");
 
        InputStream in = banner.getInputStream();
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
 
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;
            System.out.println(line);
        }
        reader.close();
    }
}

файлыapplicationContext.xmlЗапись в файле выглядит следующим образом:

<bean id="customResourceLoader" class="cn.howtodoinjava.demo.CustomResourceLoader"></bean>

для тестированияCustomResourceLoader beanи позвониshowResourceData()метод, используя следующий код:

@SuppressWarnings("resource")
public static void main(String[] args) throws Exception
{
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 
    CustomResourceLoader customResourceLoader = (CustomResourceLoader) context.getBean("customResourceLoader");
 
    customResourceLoader.showResourceData();
}

https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/25/16e007f0502c5381~tplv-t2oaga2asx-image.image
https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/25/16e007f0502c5381~tplv-t2oaga2asx-image.image

Поскольку мы проходимSpringзагрузчик ресурсов для доступа к ресурсам, поэтому пользовательский загрузчик ресурсов должен реализовыватьApplicationContextAwareинтерфейс илиResourceLoaderAwareинтерфейс.

Загружать внешние ресурсы

Загружать ресурсы из корневой папки приложения

Для загрузки файлов из папки приложения используйте следующий шаблон:

Resource banner = resourceLoader.getResource("file:data.txt");

Загружать ресурсы из пути к классам

Чтобы загрузить файлы из пути к классам, используйте следующий шаблон:

Resource banner = resourceLoader.getResource("classpath:classpathdata.txt");

Загружать ресурсы из файловой системы

Для загрузки файлов из файловой системы вне папки приложения используйте следующий шаблон:

Resource banner = resourceLoader.getResource("file:c:/temp/filesystemdata.txt");

отURLресурс загрузки

из любогоURLДля загрузки файла используйте следующий шаблон:

Resource banner = resourceLoader.getResource("//howtodoinjava.com/readme.txt");

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

Как вставлять внешние файлы

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

<bean id="customResourceLoader" class="com.howtodoinjava.demo.CustomResourceLoader">
 
    <property name="resource">
        <value>classpath:classpathdata.txt</value>
        <!-- or -->
        <value>file:data.txt</value>
    </property>
 
</bean>

CustomResourceLoaderСледующее:

public class CustomResourceLoader {
 
    private Resource resource;
 
    public Resource getResource() {
        return resource;
    }
 
    public void setResource(Resource resource) {
        this.resource = resource;
    }
}

После инициализации контекста ресурсы вводятся вCustomResourceLoaderизresourceв свойствах. существуетSpring Boot ResourceloaderЭтот же код можно использовать и в примере.

Оригинальная ссылка:Spring ResourceLoaderAware — чтение файла в Spring