Spring IoC container bitta yoki bir nechta bean'larni boshqaradi. Bu bean'lar konfiguratsiya metama'lumotlari yordamida yaratiladi, siz bu ma’lumotlarni konteynerga (masalan, XML-tavsiflar shaklida <bean/>
) taqdim etasiz.
O‘zi konteynerda, bu bean tavsiyalari BeanDefinition
obyektlar shaklida taqdim etiladi, ular quyidagi metama'lumotlarni (boshqa ma'lumotlar orasida) o'z ichiga oladi:
-
Paket bilan to'liq klass nomi: odatda, bu ma'lum bir beanning real amalga oshirish klassi bo'ladi.
-
Beanning o'zini qanday tutishi kerakligi haqida ma'lumotlar (doirasi, hayotiy sikli kirish chaqiruvlari va hokazolar).
-
Uning ishlashi uchun kerak bo'lgan boshqa beanlarga havolalar. Bu havolalar hamkorlar (collaborators) yoki bog‘liqliklar (dependencies) deb ataladi.
-
Yangidan yaratilgan ob'ektda o'rnatilishi kerak bo'lgan boshqa konfiguratsiya parametrlari, masalan, aloqalar puli yoki aloqalarni boshqaruvchi bean'da ishlatiladigan aloqa soni kabi.
Bu metama'lumotlar har bir bean tavsifini tashkil etuvchi xususiyatlar to'plamiga o‘zgartiriladi. Quyidagi jadvalda bu xususiyatlar tavsiflanadi:
Xususiyat | Qanday tushuntiriladi... |
---|---|
Klass |
|
Nomi |
Bean nomlash |
Doirasi |
|
Konstruktor argumentlari |
|
Xususiyatlar |
|
Avtomatik aniqlash va bog'lash rejimi |
|
Kechiktirilgan ishga tushirish rejimi |
|
Ishga tushirish metodi |
|
Yo'q qilish metodi |
ApplicationContext implementatsiyalari, aniq bean yaratish uchun ma'lumotlarni o'z ichiga oladigan bean tavsiflaridan tashqari, konteyner tashqarisida (foydalanuvchilar tomonidan) yaratilgan mavjud ob'ektlarni ham ro'yxatga olish imkonini beradi. Bu getBeanFactory() metodi orqali BeanFactory ApplicationContext'ga murojaat qilish orqali amalga oshirilishi mumkin, bu DefaultListableBeanFactory implementatsiyasini qaytaradi. DefaultListableBeanFactory bu ro'yxatga olishni registerSingleton(..) va registerBeanDefinition(..) metodlari orqali qo'llab-quvvatlaydi. Biroq, odatdagi dasturlar faqat standart bean tavsif metama'lumotlari yordamida aniqlangan bean'lar bilan ishlaydi.
Bean metama'lumotlar va qo'lda taqdim etilgan singletonlar avtomatik aniqlanish va bog'lanish va boshqa introspektsiya bosqichlarida to'g'ri ishlashi uchun imkon qadar tezroq ro'yxatga olinishi kerak. Garchi mavjud metama'lumotlar va mavjud singletonlarni qayta o'zgartirish ma'lum darajadagi qo'llab-quvvatlansa ham, vaqtida (bevosita fabrikaga kirish bilan bir vaqtning o'zida) yangi bean'larni ro'yxatga olish rasmiy ravishda qo'llab-quvvatlanmaydi va bu birgalikda kirish istisnolariga, bean konteynerida nomuvofiq holatga yoki har ikkala istisnoga olib kelishi mumkin.
Bean nomlash
Har bir bean bitta yoki bir nechta identifikatorlarga ega. Bu identifikatorlar o'zlarining joylashgan konteynerlarida noyob bo'lishlari kerak. Bean'lar odatda faqat bitta identifikatorga ega bo‘ladi. Ammo, agar bitta identifikatordan ko’proq bo‘lishi kerak bo‘lsa, qo‘shimcha identifikatorlarni taxalluslar deb hisoblash mumkin.
XML-ga asoslangan konfiguratsiya metama'lumotlarida bean identifikatorlarini belgilash uchun id
atributi, name
atributi yoki har ikkalasi birgalikda ishlatiladi. id
atributi faqat bitta identifikator belgilash imkonini beradi. Odatda, bu ismlar harf va raqamlar ('myBean', 'someService' va hokazo) bo'ladi, lekin ular maxsus belgilarni ham o'z ichiga olishi mumkin. Agar siz bean uchun boshqa taxalluslarni kiritishni istasangiz, ularni name
atributida vergul (,
), nuqta-vergul (;
) yoki bo'sh joy bilan ajratishingiz mumkin. Tarixga nazar tashlasak: Spring 3.1 versiyasiga qadar id
atributi xsd:ID
tipi sifatida belgilangan edi, bu belgilarni cheklaydi. 3.1 versiyasidan boshlab, u xsd:string
tipi sifatida belgilanadi. E’tibor bering, bean id
'ning noyobligi konteyner tomonidan ta'minlangan, lekin endi XML tahlilchilari tomonidan emas.
Bean uchun name
yoki id
belgilash shart emas. Agar siz name
yoki id
'ni aniq belgilamasangiz, konteyner o'sha bean uchun noyob nom yaratadi. Ammo, agar siz bu bean'ga ref
elementidan foydalangan holda yoki xizmat lokatori uslubidagi qidiruv orqali nom bilan murojaat qilmoqchi bo‘lsangiz, nomni belgilashingiz kerak. Nom aniqlashdan voz kechish sabablari ichki beanlar va avtomatik aniqlangan va bog'langan ob'ektlar bilan bog'liq.
java.beans.Introspector.decapitalize
da belgilangan qoidalar bilan bir xil.
Bean'ga taxallus berish (bean tavsifidan tashqari)
Beanning o'z tavsifida bir nechta nomlarni id
atributi bilan belgilangan bitta nom va name
atributida boshqa ko‘plab nomlar bilan ko‘rsatishingiz mumkin. Bu nomlar bir xil bean'ning ekvivalent taxalluslari bo'lishi mumkin va ba'zi vaziyatlarda foydali bo'ladi, masalan, har bir komponent ilova ichida umumiy bog'liqlikka murojaat qilganda, bu komponent uchun o'ziga xos bean nomidan foydalanadi.
Ammo barcha taxalluslarni belgilash har doim ham yetarli emas, bunda bean aslida belgilangan. Ba’zan boshqa joyda belgilangan bean uchun taxallus kiritish kerak. Bu odatda katta tizimlarda sodir bo'ladi, bu erda konfiguratsiya har bir quyi tizim o'rtasida bo'linadi va har bir quyi tizim o'z ob'ektlari to'plamini belgilaydi. XML-ga asoslangan konfiguratsiya metama'lumotlarida buning uchun <alias/>
elementidan foydalanishingiz mumkin. Quyidagi misolda buni qanday qilish kerakligi ko‘rsatilgan:
<alias name="fromName" alias="toName"/>
Bu holda fromName
nomli bean (xuddi shu konteynerda) - bu taxallus aniqlanishidan so'ng - toName
sifatida eslatilishi mumkin bo'ladi.
Misol uchun, A quyi tizimi uchun konfiguratsiya metama'lumotlari subsystemA-dataSource
nomi ostidagi ma’lumotlar manbaisiga murojaat qilish mumkin. B quyi tizimi uchun konfiguratsiya metama'lumotlari subsystemB-dataSource
nomi ostidagi manbaiga murojaat qiladi. Har ikkala quyi tizimdan foydalanuvchi asosiy ilova yaratilganda, asosiy ilova myApp-dataSource
nomi ostidagi ma’lumotlar manbaisiga murojaat qiladi. Ushbu uchta nomning ham bir xil obyektga murojaat qilishini ta'minlash uchun siz konfiguratsiya metama'lumotlariga quyidagi taxallus ta’riflarini qo‘shishingiz mumkin:
<alias name="myApp-dataSource" alias="subsystemA-dataSource"/>
<alias name="myApp-dataSource" alias="subsystemB-dataSource"/>
Endi har bir komponent va asosiy ilova dataSource'ga o'ziga xos nom orqali murojaat qilishi mumkin, bu har qanday boshqa ta'rif bilan nomuvofiqlikni ta'minlamaydi (samarali ravishda nomlar maydoni yaratadi), lekin ular bitta bean'ga murojaat qilishadi.
GO TO FULL VERSION