Spring konteyneri avtomatik ravishda o‘zaro aloqada bo‘lgan binlar orasida munosabatlarni o‘rnatishi mumkin. Siz Spring’ga avtomatik ravishda biningiz uchun o‘zaro aloqada bo‘lgan obyektlarni (boshqa binlar) aniqlashni ApplicationContext tarkibidan foydalanib topshirishingiz mumkin. Avtomatik aniqlash va bog‘lash quyidagi afzalliklarga ega:
-
Avtomatik aniqlash va bog‘lash xususiyatlar yoki konstruktor argumentlarini ko‘rsatish uchun ko‘p ko‘rsatmalar sonini sezilarli darajada qisqartiradi (Ushbu bobning boshqa bo‘limlarida ko‘rib chiqilgan bin shablonlari kabi boshqa mexanizmlar ham bu borada foydali.)
-
Avtomatik aniqlash va bog‘lash ob'ektlaringiz rivojlana borishi bilan konfiguratsiyani yangilash imkonini beradi. Masalan, agar sinfga bog‘liqlik qo‘shish kerak bo‘lsa, bu bog‘liqlik avtomatik ravishda qondirilishi mumkin, konfiguratsiyani o‘zgartirmasdan. Shu tariqa, avtomatik aniqlash va bog‘lash, rivojlanish jarayonida ayniqsa foydali bo‘lishi mumkin, ammo kod bazasi barqaror bo‘lganda aniq bog‘lashga o‘tishga imkon beradi.
XML asosidagi konfiguratsiya metama'lumotlaridan foydalanib, siz <bean/> elementi uchun autowire atributi yordamida bin definitsiyasida avtomatik bog‘lash rejimini belgilashingiz mumkin. Avtomatik aniqlash va bog‘lash funktsiyasi to‘rt rejimga ega. Siz har bir bin uchun avtomatik aniqlash va bog‘lashni belgilaysiz va shu bilan qaysi birini avtomatik bog‘lashni tanlashingiz mumkin. Quyidagi jadvalda avtomatik aniqlash va bog‘lashning to‘rt rejimi tasvirlangan:
| Rejim | Tavsif |
|---|---|
|
|
(Odatiy) Avtomatik aniqlash va bog‘lash yo‘q. Binlarga havolalar |
|
|
Ko‘chmas bilan avtomatik aniqlash va bog‘lash. Spring, avtomatik ravishda aniqlanishi va bog‘lanishi kerak bo‘lgan xususiyat bilan bir xil nomdagi binni qidiradi. Masalan, agar bin aniqlashda ko‘chmas orqali avtomatik aniqlash va bog‘lash ko‘rsatilsa va xususiyat |
|
|
Containerda faqat ayni xususiyat turi bir xil bo‘lgan bitta bin mavjud bo‘lsa, mulk avtomatik aniqlanishi va bog‘lanishi mumkin bo‘ladi. Agar bir nechta mavjud bo‘lsa, bu bin uchun |
|
|
|
byType yoki constructor rejimlaridan foydalangan holda massivlar va tiplar to‘plamlarini bog‘lash mumkin. Bunday hollarda, konteyner ichidagi va kutilgan turga mos keladigan barcha avtomatik aniqlash va bog‘lash uchun nomzod komponentlar bog‘liqlikni qondirish uchun taqdim etiladi. Agar kalitning kutilgan turi String bo‘lsa, Map ning qat'iy tiplangan nusxalarini avtomatik qidirish va bog‘lashni amalga oshirishingiz mumkin. Avtomatik bog‘langan Map nusxasining qiymatlari kutilgan turga mos keladigan barcha bin nusxalaridan iborat bo‘ladi, Map nusxasining kalitlari esa mos binlar nomlarini o‘z ichiga olgan bo‘ladi.
Avtomatik aniqlash va bog‘lashning cheklovlari va kamchiliklari
Avtomatik aniqlash va bog‘lash butun loyiha davomida izchil qo'llanilganda eng yaxshi natija beradi. Agar avtomatik aniqlash va bog‘lash umuman ishlatilmasa, dasturchilar faqat bitta yoki ikkita bin aniqlash uchun uni ishlatishda qiynalishi mumkin.
Avtomatik aniqlash va bog‘lashning cheklov va kamchiliklari:
-
propertyvaconstructor-argda aniq ko‘rsatilgan bog‘lanish har doim avtomatik aniqlash va bog‘lashni almashtiradi. Oddiy xususiyatlar, masalan primitivlar,StringsvaClasses(va bunday oddiy xususiyatlar massivi) ni avtomatik ravishda bog‘lash mumkin emas. Ushbu cheklov maqsadli. -
Avtomatik aniqlash va bog‘lash aniq bog‘lashdan ko‘ra kamroq aniq. Ilgari muqobil bo'lgan jadvalda ko‘rsatilganidek, Spring noaniqlik holatida bashorat qilishni amalga oshirmaydi, bu kutilmagan natijalarga olib kelishi mumkin. Spring tomonidan boshqariladigan ob'ektlaringiz o‘rtasidagi o‘zaro bog‘liqliklar endi ochiq tarzda hujjatlashtirilmagan.
-
Bog‘lovchi ma'lumotlar, Spring konteyneridan hujjatlarni yaratadigan vositalar uchun mavjud bo‘lmasligi mumkin.
-
Konteynerda bir nechta bin aniqlashlari, o‘rnatish metodi yoki konstruktor argumenti uchun aniq bitta qiymat kutilayotgan bog‘liqliklar uchun bu masala hal etilmaydi. Agar bin aniqlash aniq mavjud bo‘lmasa, istisno yuzaga keladi.
So‘nggi holatda, sizda bir nechta alternativ mavjud:
-
Avtomatik aniqlash va bog‘lashdan voz keching va aniq bog‘lanishga o‘ting.
-
autowire-candidateatributinifalsega o‘zgartirib, bin aniqlash uchun avtomatik aniqlash va bog‘lashdan voz keching. -
primaryatributinitrueqilib, asosiy komponent nomzodi sifatida bitta bin aniqlashni tayinlang. -
Annotatsiyalarga asoslangan konfiguratsiya orqali nozikroq nazoratni amalga oshiring.
Avtomatik aniqlash va bog‘lash metodidan binning chiqarilishi
Har bir bin uchun, uni avtomatik aniqlash va bog‘lash metodidan chiqarishingiz mumkin. Spring XML formatida <bean/> elementi uchun autowire-candidate atributini false qilib belgilang. Konteyner ushbu bin aniqlashni avtomatik aniqlash va bog‘lash (shu jumladan, @Autowired kabi annotatsiya stilidagi konfiguratsiyalar) infratuzilmasiga kirish mumkin bo‘lmaydi.
autowire-candidate atributi faqat turga asoslangan avtomatik aniqlash va bog‘lash metodiga ta'sir qiladi. U aniq ismlar bo‘yicha havolalarga ta'sir qilmaydi, ular ko‘rsatilgan bin nomzod sifatida belgilangan bo‘lmasa ham aniqlanadi. Natijada, ko‘chmas orqali avtomatik aniqlash va bog‘lash, agar nom mos kelsa, binni kiritadi.
Bin nomlari bilan moslashtirishga asoslangan avtomatik aniqlash va bog‘lash uchun komponent nomzodlarini cheklash ham mumkin. <bean/> yuqori darajadagi element o‘zining default-autowire-candidates atributida bir yoki bir nechta shablonlarni qabul qiladi. Masalan, Repository bilan tugaydigan bin nomi bo‘lgan har qanday binning komponent nomzod maqomini cheklash uchun *Repository qiymatini qo‘ying. Bir nechta shablonlarni olish uchun ularni vergul bilan ajratilgan ro‘yxatda ko‘rsating. autowire-candidate atributi uchun aniq true yoki false qiymati doimo ustunlik beradi. Bunday binlar uchun shablonni moslashtirish qoidalari qo‘llanilmaydi.
Ushbu usullar hech qachon boshqa binlarga avtomatik aniqlash va bog‘lash orqali kiritilishi kerak bo‘lmaydigan binlarni ishlatishda foydalidir. Bu chiqarilgan bin o‘zi avtomatik aniqlash va bog‘lash yordamida konfiguratsiya qilinishi mumkin emas degani emas. Aksincha, binning o‘zi avtomatik aniqlash va bog‘lash uchun komponent nomzodi sifatida olinmaydi.
GO TO FULL VERSION