Spring Resource

Стандартный класс Java java.net.URL и стандартные обработчики различных префиксов URL, к сожалению, недостаточно для любого доступа к низкоуровневым ресурсам. Например, не существует стандартизованной реализации URL-адреса, которая может использоваться для доступа к ресурсу, который необходимо получить из пути к классам или относительно ServletContext. Хотя можно зарегистрировать новые обработчики для специализированных префиксов URL (аналогично существующим обработчикам для префиксов, таких как http:), это, как правило, довольно сложно, и в интерфейсе URL по-прежнему отсутствуют некоторые желательные функции, такие как метод проверки наличия ресурса, на который указывает.

Интерфейс Resource

Интерфейс Resource в Spring призван стать более функциональным интерфейсом для абстрагирования доступа к ресурсам низкого уровня. В следующем листинге показано определение интерфейса Resource:

Java

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();
}

Kotlin

interface Resource : InputStreamSource {

    fun exists(): Boolean

    val isOpen: Boolean

    val url: URL

    val file: File

    @Throws(IOException::class)
    fun createRelative(relativePath: String): Resource

    val filename: String

    val description: String
}

Как видно из определения интерфейса Resource, он расширяет интерфейс InputStreamSource. В следующем листинге показано определение интерфейса InputStreamSource:

Java

public interface InputStreamSource {

    InputStream getInputStream() throws IOException;
}

Kotlin

interface InputStreamSource {

    val inputStream: InputStream
}

Некоторые из наиболее важных методов интерфейса Resource:

  • getInputStream(): находит и открывает ресурс, возвращая InputStream для чтения из ресурса. Ожидается, что каждый вызов возвращает новый InputStream. Ответственность за закрытие потока лежит на вызывающей стороне.
  • exists(): возвращает логическое значение, указывающее, действительно ли этот ресурс существует в физической форме.
  • isOpen(): возвращает логическое значение, указывающее, представляет ли этот ресурс дескриптор с открытым потоком. Если true, InputStream не может быть прочитан несколько раз и должен быть прочитан только один раз, а затем закрыт, чтобы избежать утечки ресурсов. Возвращает false для всех обычных реализаций ресурсов, за исключением InputStreamResource.
  • getDescription(): возвращает описание этого ресурса, которое будет использоваться для вывода ошибок при работе с ресурсом. Часто это полное имя файла или фактический URL-адрес ресурса.

Другие методы позволяют получить фактический URL-адрес или объект File, представляющий ресурс (если базовая реализация совместима и поддерживает эту функцию).

Сам Spring широко использует абстракцию ресурсов в качестве типа аргумента во многих сигнатурах методов, когда требуется ресурс. Другие методы в некоторых API-интерфейсах Spring (например, конструкторы для различных реализаций ApplicationContext) принимают String, которая в простой или неприукрашенной форме используется для создания ресурса, соответствующего этой реализации контекста, или с помощью специальных префиксов на пути String позволяет вызывающей стороне указать что необходимо создать и использовать конкретную реализацию Resource.

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

Абстракция ресурса не заменяет функциональность. По возможности она оборачивает функциональность. Например, UrlResource обертывает URL и использует обернутый URL для выполнения своей работы.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки