Java'dagi java.net.URL standart sinfi va URL uchun standart prefikslar uchun ba'zi biriga mos keladigan standard handler'lar ba'zan past darajadagi resurslarga kirishni ta'minlash uchun yetarli emas. Masalan, sinf yo'llari boʻyicha resursga yoki ServletContext ustidagi resursga kirish imkonini beradigan standart URL amalga oshirilishi yoʻq. Yangi URL handler'lar uchun maxsus prefikslar (masalan, http: kabi mavjud handler'lar singari) qo'shilishi mumkin bo'lsa-da, bu odatda murakkab va URL interfeysi hali ham resurs mavjudligini tekshirish kabi ba'zi foydali funksiyalarni qo'shishga yetmaydi.
Interfeys Resource
Spring freamwork'ining org.springframework.core.io. paketida joylashgan Resource interfeysi past darajadagi resurslarga kirishni abstraksiyalash uchun mo'ljallangan. Quyidagi ro'yxatda Resource interfeysining qisqacha ta'rifi keltirilgan. Batafsil ma'lumotni Resource javadoc orqali ko'rishingiz mumkin.
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();
}
Ko'rib turganingizdek Resource interfeysi InputStreamSource interfeysini kengaytiradi. Keyingi listingda InputStreamSource interfeysining ta'rifi keltirilgan:
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
Resource interfeysidagi eng muhim metodlardan ba'zilari:
-
getInputStream(): Resursni topadi va ochadi, resursdan o'qish uchunInputStreamqaytaradi. Har bir chaqiriq yangiInputStreamqaytarishi kerak. Stream'ni yopish javobgarligi chaqirilgan kodga yuklanadi. -
exists(): Berilgan resursning jismoniy mavjudligi haqidabooleanqiymat qaytaradi. -
isOpen(): Ushbu resurs ochiq stream bo'lgan descriptor (handl) ni anglatishini ko'rsatadiganbooleanqiymat qaytaradi. Agartruebo'lsa,InputStreambir necha marta o'qilmaydi va faqat bir marta o'qilib, keyin resursning sizib chiqishidan qochish uchun yopilishi kerak. Standart resurs realizatsiyalarining hammasi uchunfalseqaytaradi,InputStreamResourcedan tashqari. -
getDescription(): Ushbu resursning xatolik chiqishida ishlatiladigan tasnifi qaytariladi. Ko'pincha bu to'liq nomlangan fayl nomi yoki resursning asl URL'si boʻladi.
Boshqa metodlar haqiqiy URL yoki resursni ifodalovchi File obyektini olish imkonini beradi (agar asosiy amalga oshirish mos keladi va ushbu funksiyani qo'llab-quvvatlasa).
Resource interfeysining ba'zi amalga oshirilishlari WritableResource kengaytirilgan interfeysini ham amalga oshiradi, bu resursga yozish imkoniyatini beradi.
Springning o'zi ko'pincha Resource abstraksiyasidan ko'plab metod imzolarida resurs kerak bo'lganda argument turi sifatida foydalanadi. Ba'zi bir Spring API interfeyslarining boshqa metodlari (masalan, turli ApplicationContext amalga oshirilishlarining konstruktorlari) String qabul qiladi, bu resursni yaratish va undan foydalanish uchun foydalaniladi, yoki maxsus prefikslar yordamida String yo'li bo'yicha chaqirilish kodiga ushbu Resource ning maxsus amalga oshirilishini yaratish va undan foydalanish imkonini beradi.
Garchi Resource interfeysi Springda va o'zi tomonidan Springda tez-tez ishlatilsa-da, aslida uni o'zingizning kodda resurslarga kirishni yaxshiroq ta'minlash uchun ko'p ishlatish qulaydir, hatto kodingiz Springning boshqa qismlarini bilmasa va ularga amalga oshmasa ham. Bu Springga bog'liq bo'lishni anglatadi, ammo aslida bunday bog'lanish faqat ushbu kichik mustahkamlovchi sinflar to'plamiga amalga oshiriladi, bu esa URLni yanada funktsional o'rnini bosuvchi sifatida xizmat qiladi va siz undan foydalanadigan boshqa har qanday kutubxona bilan ekvivalent hisoblanishi mumkin.
Resource abstraksiyasi funksionallikni o'rinbosar qilmaydi. Imkoni boricha u o'rash qiladi. Masalan,
UrlResource URL'ni o'rab turadi va o'ralgan
URLdan o'z vazifasini bajarish uchun foydalanadi.
Ichki Resource amalga oshirilishlari
Spring bir nechta ichki Resource amalga oshirilishlarini o'z ichiga oladi:
-
UrlResource -
ClassPathResource -
FileSystemResource -
PathResource -
ServletContextResource -
InputStreamResource -
ByteArrayResource
Springda mavjud Resource amalga oshirilishlarining to'liq ro'yxatini "Ma'lum barcha sinf amalga oshirilishlari" bo'limida topishingiz mumkin.
UrlResource
UrlResource java.net.URLni o'rab turadi va URL orqali odatda mavjud bo'lgan har qanday obyektga kirishni ta'minlash uchun foydalanilishi mumkin, masalan, fayllar, HTTPS manzillari, FTP manzillari va boshqalar. Barcha URL manzillari standart String tasvirga ega, shuning uchun URL manzillarining bir turini boshqa turdan ajratish uchun standart prefikslar qo'llaniladi, masalan, fayl tizimiga kirish uchun file:, HTTPS protokoli orqali resurslarga kirish uchun https:, FTP protokoli orqali resurslarga kirish uchun ftp: va boshqalar.
UrlResource Java kodida UrlResource konstrukroridan foydalanib aniq yaratiladi, lekin ko'pincha String argumentini qabul qiladigan va yo'lni ifodalash uchun mo'ljallangan API metodini chaqirganda yaratilib, yashirin tarzda yaratiladi. Oxirgi holatda, JavaBeans sinfining PropertyEditor oxir-oqibat qaytariladi va ma'lum bir (property editor uchun tanish bo'lgan) prefiks (masalan, classpath:)ni o'z ichiga olsa, u ushbu prefiks uchun mos maxsus Resourceni yaratadi. Biroq, u prefiksni tanimasa, u standat URL string deb qabul qiladi va UrlResourceni yaratadi.
ClassPathResource
Ushbu sinf classpath ichidan olish uchun resursni ifodalaydi. Resurslarni yuklash uchun yoki oqimning kontekst sinf yuklovchisi, yoki berilgan sinf yuklovchi, yoki berilgan sinfni ishlatadi.
Ushbu Resource amalga oshirish, agar classpath yo'lidagi resurs fayl tizimida bo'lsa java.io.File sifatida uzatishni qo'llab-quvvatlaydi, lekin jar ichida bo'lgan va fayl tizimiga (servlet engine yoki boshqa muhit orqali) ko'chirilmagan classpath resurslari uchun emas. Ushbu masalani hal qilish uchun, Resourcening turli xil amalga oshirilishlari har doim java.net.URL sifatida hal qilishni qo'llab-quvvatlaydi.
ClassPathResource Java kodida ClassPathResource konstruktoridan foydalangan holda yaratiladi, ammo ko'pincha API interfeysining metodini chaqirganda va yo'lni ifodalash uchun String argumentini qabul qilganda yashirin tarzda yaratiladi. Oxirgi holatda JavaBeans sinfi PropertyEditor prefiks classpath: ni tanib, ClassPathResource ni yaratadi.
FileSystemResource
Bu java.io.File klassining instansiya deskriptori uchun Resource amalga oshirilishi. Ushbu Spring string konversiyalari asosida java.nio.file.Path ishlov berishni qo'llab-quvvatlaydi, lekin barcha operatsiyalarni java.nio.file.Files API orqali amalga oshiradi. Toza java.nio.path.Path asosida qo'llab-quvvatlash uchun PathResourcedan foydalaning. FileSystemResource File va URL sifatida ham qo'llab-quvvatlashni amalga oshiradi.
PathResource
Bu java.nio.file.Path deskriptorlari uchun Resource interfeys amalga oshirilishi bo'lib, barcha operatsiyalar va konversiyalarni Path API orqali amalga oshiradi. Ushbu amalga oshirish File va URL sifatida hal qilishni qo'llab-quvvatlaydi, shuningdek, WritableResource kengaytirilgan interfeysni amalga oshiradi. PathResource aslida java.nio.path.Path asosida FileSystemResourcening o'rniga toza alternativ hisoblanadi, createRelative mantiqi bilan boshqa ishlaydigan.
ServletContextResource
Bu ServletContext resurslari uchun Resource amalga oshirilishi bo'lib, mos web ilovaning ildiz katalogidagi nisbiy yo'llarni talqin qiladi.
U har doim streaming va URL bilan kirishni qo'llab-quvvatlaydi, lekin agar web ilova arxivi chiqarilgan bo'lsa va resurs jismonan fayl tizimida joylashgan bo'lsa, faqatgina java.io.File orqali kirishni ta'minlaydi. Bu, aslida, servlet konteyneriga bog'liq, fayl tizimiga joylashtirilgan yoki yo'qligi, JAR'dan yoki boshqa joydan (masalan, ma'lumotlar bazasidan, bu mumkin) to'g'ridan-to'g'ri kirish imkoniyatiga ega.
InputStreamResource
InputStreamResource berilgan InputStream uchun Resource amalga oshirilishi. Bu, agar boshqa Resource amalga oshirilishi mos kelmasa, foydalanilishi kerak. Ayniqsa, iloji boricha ByteArrayResource yoki faylga asoslangan Resourcening boshqa amalga oshirilishlarini afzal ko'rsating.
Boshqa Resource amalga oshirilishlaridan farqli o'laroq, bu ochiq resurs uchun descriptor hisoblanadi. Shuning uchun u isOpen() funksiyasidan true qaytaradi. Uni resurs descriptorini biror joyda saqlash kerak bo'lsa yoki stream'ni bir necha marotaba o'qish kerak bo'lsa, foydalanmang.
ByteArrayResource
Bu berilgan byte massiv uchun Resource amalga oshirilishi bo'lib, berilgan byte massiv uchun ByteArrayInputStream yaratadi.
Bu bir-marta ishlatiladigan InputStreamResourceni ishlatmasdan, har qanday berilgan byte massivdan mazmunini yuklash uchun foydalidir.
GO TO FULL VERSION