JavaRush /Курси /Модуль 5. Spring /Інтерфейс Resource

Інтерфейс Resource

Модуль 5. Spring
Рівень 4 , Лекція 2
Відкрита

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

Інтерфейс Resource

Інтерфейс Resource Фреймворк Spring, розташований у пакеті org.springframework.core.io. призначений для абстрагування доступу до низькорівневих ресурсів. У наступному списку коротко представлений інтерфейс Resource. Детальнішу інформацію дивись у javadoc Resource.


public interface Resource extends InputStreamSource {
    boolean exists();
    boolean isReadable();
    boolean isOpen();
    boolean isFile();
    URL getURL() throws IOException;
    URI getURI() throws IOException;
    File getFile() throws IOException;
    ReadableByteChannel readableChannel() throws IOException;
    long contentLength() throws IOException;
    long lastModified() throws IOException;
    Resource createRelative(String relativePath) throws IOException;
    String getFilename();
    String getDescription();
}

Як видно з визначення інтерфейсу Resource, він розширює інтерфейс InputStreamSource. У наступному лістингу показано визначення інтерфейсу InputStreamSource:


public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}

Деякі з найбільш важливих методів інтерфейсу Resource:

  • getInputStream(): Знаходить та відкриває ресурс, повертаючи InputStream для зчитування з ресурсу. Передбачається, що кожен виклик повертає новий InputStream. Відповідальність за закриття потоку лежить на коді, що викликає.

  • exists(): Повертає булеве значення boolean, що вказує, чи існує цей ресурс у фізичній формі.

  • isOpen(): Повертає булеве значення boolean, що вказує, чи представляє даний ресурс дескриптор (Хендл) з відкритим потоком. Якщо true, то InputStream не може бути зчитаний кілька разів і повинен бути зчитаний лише один раз, а потім закритий, щоб уникнути витоку ресурсів. Повертає false для всіх стандартних реалізацій ресурсів, за винятком InputStreamResource.

  • getDescription(): Повертає опис для цього ресурсу, який буде використовуватися для виведення помилок під час роботи з ресурсом. Часто це повністю уточнене ім'я файлу або фактичний URL ресурсу.

Інші методи дозволяють отримати фактичний URL або об'єкт File, ресурс (якщо базова реалізація сумісна і підтримує цю функціональність).

Деякі реалізації інтерфейсу Resource також реалізують розширений інтерфейс WritableResource для ресурсу, який підтримує запис до нього.

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

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

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

Вбудовані реалізації Resource

Spring включає кілька вбудованих реалізацій Resource:

  • UrlResource

  • ClassPathResource

  • FileSystemResource

  • PathResource

  • ServletContextResource

  • InputStreamResource

  • ByteArrayResource

Повний список реалізацій Resource, доступних у Spring, можна знайти в розділі "Всі відомі реалізації класів" в javadoc Resource.

UrlResource

UrlResource огортає java.net.URL і може бути використаний для отримання доступу до будь-якого об'єкта, доступ до якого у звичайних забезпечується за допомогою URL. Наприклад, до файлів, цільового елементу HTTPS, цільового елементу FTP тощо. Усі URL-адреси мають стандартизоване String подання, тому для позначення одного типу URL-адреси від іншого використовуються відповідні стандартизовані префікси. До них належать file: для доступу до шляхів файлової системи, https: для доступу до ресурсів за протоколом HTTPS, ftp: для доступу до ресурсів протоколу FTP та інші.

UrlResource створюється кодом Java шляхом явного використання конструктора UrlResource, але найчастіше створюється і неявно, якщо викликати метод API-інтерфейсу, що приймає аргумент String, призначений для представлення шляху. В останньому випадку PropertyEditor класу JavaBeans зрештою вирішує, який тип Resource створити. Якщо рядок шляху містить відомий (мається на увазі редактору властивостей) префікс (наприклад, classpath:), то створюється спеціалізований Resource для цього префікса. Однак, якщо він не розпізнає префікс, він приймає рядок за стандартний рядок URL і створює UrlResource.

ClassPathResource

Цей клас представляє ресурс, який потрібно отримати з classpath. Для завантаження ресурсів використовується або завантажувач контекстних класів потоку, або завантажувач класів, або цей клас.

Ця реалізація Resource підтримує дозвіл як java.io.File, якщо ресурс шляху класів знаходиться у файловій системі, але не для ресурсів classpath, які знаходяться в jar і не були розгорнуті (рушієм сервлета або будь-яким іншим середовищем) до файлової системи. Щоб вирішити цю проблему, різні реалізації Resource завжди мають підтримку виконання дозволу у вигляді java.net.URL.

ClassPathResource створюється в коді Java за допомогою конструктора ClassPathResource, але найчастіше створюється і неявно, якщо викликати метод API-інтерфейсу, що приймає аргумент String, призначений для представлення шляху. Для останнього випадку PropertyEditor класу JavaBeans розпізнає спеціальний префікс classpath: у рядку шляху і в цьому випадку створює ClassPathResource.

FileSystemResource

Це реалізація Resource, призначена для дескрипторів екземплярів класу java.io.File. Він також підтримує обробку java.nio.file.Path, застосовуючи стандартні для Spring перетворення шляхів на основі рядків, але виконуючи всі операції через API-інтерфейс java.nio.file.Files. Для чистої підтримки на основі java.nio.path.Path замість цього використовуй PathResource. FileSystemResource підтримує дозвіл як у вигляді File, так і у вигляді URL.

PathResource

Це реалізація інтерфейсу Resource, призначена для дескрипторів java.nio.file.Path, що виконує всі операції та перетворення через API-інтерфейс Path. Ця реалізація підтримує роздільну здатність як File, так і URL, а також реалізує розширений інтерфейс WritableResource. PathResource фактично є чистою альтернативою FileSystemResource, заснованою на java.nio.path.Path, з іншою логікою роботи createRelative .

ServletContextResource

Це реалізація Resource для ресурсів ServletContext, яка інтерпретує відносні шляхи в кореневому каталогу відповідної вебпрограми.

Вона завжди підтримує потоковий доступ і доступ за URL, але також надає доступ за java.io.File лише в тому випадку, якщо архів вебпрограми розгорнутий, а ресурс фізично перебуває у файловій системі. Чи буде він розгорнутий у файловій системі, чи буде він доступний безпосередньо з JAR або звідкись ще, наприклад, з бази даних (що цілком можливо), насправді залежить від контейнера сервлетів.

InputStreamResource

InputStreamResource — це реалізація Resource для цього InputStream. Її слід використовувати лише в тому випадку, якщо не можна застосувати конкретну реалізацію Resource. Зокрема, надавай перевагу ByteArrayResource або будь-якій з реалізацій Resource, заснованих на файлах, де це можливо.

На відміну від інших реалізацій Resource , це дескриптор для вже відкритого ресурсу. Тому він повертає true з функції isOpen(). Не використовуй її, якщо необхідно десь зберігати дескриптор ресурсу або якщо потрібно зчитувати потік кілька разів.

ByteArrayResource

Це реалізація Resource , призначена для вказаного байтового масиву. Створює ByteArrayInputStream для вказаного байтового масиву.

Вона корисна для завантаження вмісту з будь-якого вказаного байтового масиву без необхідності використання одноразового InputStreamResource .

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ