JavaRush /Kurslar /All lectures for UZ purposes /Qaramliklarni hal qilish jarayoni

Qaramliklarni hal qilish jarayoni

All lectures for UZ purposes
Daraja, Dars
Mavjud

Konteyner bina qaramliklarni quyidagicha hal qiladi:

  • ApplicationContext barcha binlarni tasvirlaydigan konfiguratsion metadata yordamida yaratiladi va ishga tushiriladi. Konfiguratsion metadata XML, Java kod yoki annotatsiyalar yordamida berilishi mumkin.

  • Har bir bina uchun uning qaramliklari propertie, konstruktor argumenti yoki statik zavod metodining argumenti sifatida ifodalanadi (agar siz oddiy konstruktor o'rniga shuni ishlatayotgan bo'lsangiz). Ushbu qaramliklar bina haqiqatan yaratishda taqdim etiladi.

  • Har bir property yoki konstruktor argumenti qiymatni o'rnatish uchun haqiqiy qiymat aniqlamasini yoki konteynerdagi boshqa binaga havolani ifodalaydi.

  • Qiymat bo'lgan har bir property yoki konstruktor argumenti, belgilangan formatdan ushbu property yoki konstruktor argumentining haqiqiy turiga o'zgartiriladi. Odatiy holda, Spring string formatidan berilgan qiymatni int, long, String, boolean va shunga o'xshash barcha ichki turlarga o'zgartira oladi.

Spring konteyneri har bir binaning konfiguratsiyasini konteyner yaratilganda tekshiradi. Ammo, binaning o'zining propertielari bino yaratilgunga qadar o'rnatilmaydi. Singleton hajmidagi binlar va oldindan yaratilishga sozlangan binlar (odatiy) konteyner yaratilganda yaratiladi. Aks holda, bino so'rov paytida yaratiladi. Bino yaratish, potentsial ravishda, bina qaramligi grafigini yaratishga olib kelishi mumkin, chunki bino qaramliklari, uning qaramliklarining qaramliklari (va hokazo) yaratiladi va o'rnatiladi. Diqqat qiling, ushbu qaramliklarni hal qilish muammolari kech, ya'ni ta'sirlangan bin birinchi marta yaratilganda paydo bo'lishi mumkin.

Tsiklik qaramliklar

Agar ko'proq konstruktor orqali kiritishni ishlatsangiz, tsiklik qaramliklarni hal qilib bo'lmaydigan vaziyatni yaratishingiz mumkin.

Misol uchun: A sinfi B sinfining nusxasini konstruktor asosidagi kiritish orqali talab qiladi, va B sinfi konstruktor asosidagi kiritish orqali A sinfining nusxasini talab qiladi. Agar A va B sinflarining binlarini bir-biriga kiritishga sozlasangiz, Spring IoC konteyneri ushbu tsiklik havolani bajarish paytida aniqlaydi va BeanCurrentlyInCreationException istisnosini yaratadi.

Bir nechta imkoniyatli yechimlardan biri ba'zi sinflarning kodini tahrirlash, shunda konfiguratsiya konstruktorlar o'rniga setterlar orqali amalga oshirilishi kerak. Yoki, konstruktor orqali qaramlik kiritishdan qochib, faqat setter orqali kiritishni ishlating. Boshqa so'zlar bilan aytganda, bu tavsiya qilinmasa-da, setter orqali kiritish yordamida tsiklik qaramliklarni sozlash mumkin.

Odatdagi holatdan farqli o'laroq (tsiklik qaramliklar yo'q), A bina va B bina o'rtasidagi tsiklik qaramlik bir binani boshqa binaga to'liq ishga tushgunga qadar kiritishga majbur qiladi (klassik “tovuq va tuxum (sabab va oqibat)” stsenariysi).

Odatda, Spring'ga ishonib, har bir narsa to'g'ri amalga oshirilganiga ishonishingiz mumkin. U yuklab olish vaqtida konfiguratsiya muammolarini, masalan, mavjud bo'lmagan binlarga havolalar va tsiklik qaramliklarni aniqlaydi. Spring propertielarini belgilaydi va bin yaratilganda qaramliklarni eng keyinroq hal qiladi. Bu shuni anglatadiki, to'g'ri yuklangan Spring konteyneri keyinchalik, agar biror ob'ektni yaratishda muammo bo'lsa yoki uning qaramliklaridan biri bo'lsa, istisno yaratishi mumkin - masalan, bina yo'q yoki noto'g'ri property natijasida istisno yaratadi. Ba'zi konfiguratsion muammolarning potentsial kechikkan ko'rinishi sababli, odatiy ApplicationContext realizatsiyalari oldindan binalarni yaratadi. Ushbu binalarni haqiqatan kerak bo'lgunga qadar yaratishga vaqt va xotirani sarflab, siz ApplicationContext yaratishda konfiguratsiya muammolarini aniqlaysiz, keyinroq emas. Siz hali ham bu odatiy xatti-harakatni o'zgartirishingiz mumkin, shunda singleton binlar iloji boricha kechikib yaratiladi, iloji boricha tezroq oldindan yaratish o'rniga.

Agar tsiklik qaramliklar mavjud bo'lmasa, bitta yoki bir nechta o'zaro binlar qaram bino ichiga kiritilganda, har bir o'zaro bino to'liq kiritilgunga qadar sozlanadi. Bu shuni anglatadiki, agar A bina B binasiga bog'liq bo'lsa, Spring IoC konteyneri B binani to'liq sozlaydi, so'ng A bin uchun setterni chaqiradi. Boshqa so'zlar bilan aytganda, bino nusxasi yaratiladi (agar u oldindan yaratilgan singleton bo'lmasa), uning qaramliklari o'rnatiladi va muvofiq hayotiy tsikl metodlari (masalan, sozlangan init metod yoki InitializingBean callback metodi) chaqiriladi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION