Singleton ko'rinishi
Faqat bitta umumiy bean-obyekt nazorat qilinadi, va bu bean-obyektga id yoki id’lar orqali murojaat qilinganida, Spring konteyner aynan shu bean-objektni qaytaradi.
Ya'ni, bean ta'rifi qo'shilganida va u singleton ko'rinishiga ega bo'lsa, Spring IoC-konteyner aynan bitta bean ta’rifi asoslangan obyektni yaratadi. Bu yagona obyekt singleton bean-lar keshida saqlanadi, va keyingi barcha murojaatlar va bu nomlangan bean-ga ishora qilinadi va keshlangan obyektni qaytaradi. Quyidagi rasmda singleton ko'rinishi qanday ishlashi ko'rsatilgan:
Spring'dagi singleton tushunchasi "To'rtlik bandasi" (Gang of Four/GoF) shablonidagi singleton tushunchasidan farq qiladi. GoF singleton obyektida obyekt ko'rinishi qattiq kodlanadi, shunda har bir ClassLoader uchun maxsus klassdan faqat bitta obyekt hosil qilinadi. Spring'dagi singleton ko'rinishi ko'proq per-container va per-bean tushunchasi bilan ifodalanadi. Bu degani, agar siz bitta Spring konteynerida konkret klass uchun bitta beanni ta’riflasangiz, Spring konteyner bir va faqat bitta klassdan hosil bo'lgan obyektni yaratadi. Singleton ko'rinishi – bu Spring ning standart ko'rinishi. Beanni XMLda singleton sifatida aniqlash uchun quyidagi uslubda aniqlasangiz bo'ladi:
<bean id="accountService" class="com.something.DefaultAccountService"/>
<!-- quyidagisi ekvivalent, lekin ortiqcha (standartda singleton ko'rinishi ishlatiladi) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
Prototype ko'rinishi
Prototype ko'rinishi uchun har safar bean so'ralganda yangi bean-obyekt hosil qilinadi. Ya'ni, bean boshqa bean-ga injection qilinganda yoki konteyner orqali getBean() metodi orqali so'ralganda. Odatda, holatni saqlagan barcha bean-lar uchun prototype ko'rinishidan foydalanish kerak va holatni saqlamaydigan bean-lar uchun singleton ko’rinishidan foydalanish lozim.
Quyidagi diagramma Spring'dagi prototype ko'rinishini tasvirlaydi:
(DAO odatda prototip sifatida sozlanmagan, chunki tipik DAO hech qanday dialog holatini saqlamaydi. Singleton obyektini qayta ishlatish osonroq edi).
Quyidagi misolda Prototype ko'rinishida bean XMLda aniqlanadi:
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
Boshqa ko'rinishlardan farqli o'laroq, Spring bean-prototipning to'liq hayot tsiklini nazorat qilmaydi. Konteyner bir prototip obyektini yaratadi, sozlaydi va boshqa komponentlar bilan ulaydi, lekin bu prototip obyektini keyinchalik kuzatmaydi. Shuning uchun, hayot tsikli uchun qaytuv qo'ng'irog'lari barcha obyektlar uchun ko'rinishidan qat'i nazar chaqiriladi, lekin prototiplar holatida, sozlangan hayot tsikli yo'q qilish qo'ng'irog'lari chaqirilmaydi. Mijoz kodi prototype ko'rinishidagi obyektlarni tozalashi va prototip bean-lar tomonidan foydalanadigan resurslarni tushirish kerak. Spring konteyneridan prototype ko'rinishidagi bean-lar tomonidan foydalangan resurslarni tushurishini ta’minlash uchun maxsus bean postprocessoridan foydalanishga harakat qiling.
Bir ma'noda, prototype ko'rinishidagi bean-larga nisbatan Spring konteynerining roli Java new operatorining o'rnini egallaydi. Bu vaqtdan keyin barcha hayot tsikli nazorati klient tarafidan amalga oshirilishi kerak. (Spring konteyneridagi bean hayot tsikli haqida ko'proq ma'lumotni Hayot tsikli qaytuv qo'ng'iroqlarida ko'rishingiz mumkin).
Prototip-bean bog'li singleton-lar
Agar siz singleton ko'rinishidagi bean-lardan foydalansangiz va prototip-bean bog'lanmaganligini yodda tutsangiz, bog'lanishlar nusxasi yaratilganda yechiladi. Shuning uchun, prototip-beandan singleton ko'rinishdagi bean-ga bog'lanish qilsangiz, yangi prototip-bean nusxasi yaratiladi va singleton bean-ga o'rnatiladi. Bu prototip nusxa, singleton ko'rinishidagi bean-ga taqdim etilgan yagona nusxa bo'ladi.
Agar sizga singleton ko'rinishidagi bean-ga, ijro paytida prototip ko'rinishidagi bean-ning yangi nusxasini bir necha marta olish kerak bo'lsa, siz prototip ko'rinishidagi bean-ga sizning singleton bean-ingizga bog'lanishni kiritolmaysiz, chunki bog'lanish faqat bir marta bajariladi, ya'ni Spring konteyner singleton bean nusxasini yaratganda bog'lanishlarni yechadi va kiritadi.
GO TO FULL VERSION