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 для выполнения своей работы.
Читайте также:
- Spring IoC контейнер: дополнительные возможности ApplicationContext, развертывание Spring ApplicationContext как файла RAR Java EE
- Spring IoC контейнер: BeanFactory
- Spring IoC контейнер: BeanFactory или ApplicationContext
Комментарии
Отправить комментарий