Beanlar yaratish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Bean aniqlanishi - bu, asosan, bitta yoki bir nechta obyektlarni yaratish uchun belgilangan qoidalar to'plami. So'rovga javob berishda konteyner nomlangan bean uchun qoidalar to'plamini ko'rib chiqadi va ushbu bean aniqlanishida kiritilgan konfiguratsion metama'lumotlardan foydalangan holda haqiqiy obyektni yaratadi (yoki oladi).

Agar siz XML asosidagi konfiguratsion metama'lumotlardan foydalansangiz, <bean/> elementining class atributida yaratiladigan obyektning turini (yoki klassini) ko'rsatasiz. Ushbu class atributi (ichki BeanDefinition instansiyasining Class xususiyati) odatda majburiydir. Class xususiyatidan ikki usulda foydalanish mumkin:

  • Odatda, agar konteyner bean'ni o'z ichiga kiritishi kerak bo'lsa, uning konstruktori orqali yangi operatsiyaga ekvivalent Java kodiga o'xshash tarzda bean klassini belgilash uchun ishlatiladi.

  • Obyekt yaratish uchun statik fabrika metodini chaqirish ham mumkin bo'lgan holatlarda, konteyner sinfda statik fabrika metodini chaqiradigan fayl klassini belgilash uchun ishlatiladi. statik fabrika metodidan qaytariladigan obyekt turi, xuddi shu klass yoki butunlay boshqa klass bo'lishi mumkin.

Ichki klass ismlari

Agar siz ichki klass uchun bean aniqlanishini sozlamoqchi bo'lsangiz, ikkala ikkilik ismlarni yoki asl ichki klass ismlarini ishlatishingiz mumkin.

Misol uchun, agar sizda com.example paketida SomeThing klassi bo'lsa, va bu SomeThing klassi ichida OtherThing nomli statik ichki klass bo'lsa, ular dollar belgisidan($) yoki nuqtadan (.) foydalanib ajratilishi mumkin. Shunday qilib, bean aniqlanishidagi class atributining qiymati com.example.SomeThing$OtherThing yoki com.example.SomeThing.OtherThing bo'ladi.

Konstruktor yordamida instansiya yaratish

Agar bean konstruktor yordamida yaratilsa, barcha standart klasslar ishlatilishi mumkin, va ular Spring bilan mos keladi. Bu jarayonda ishlab chiqilgan klass ma'lum interfeyslarni amalga oshirishi yoki aniq tarzda yozilishi shart emas. Faqat bean klassini belgilash kifoya. Ammo, agar ma'lum bir bean uchun qanday IoC turi qo'llanilayotganiga bog'liq, bo'sh konstruktorga (bo'limsiz) ehtiyoj bo'lishi mumkin.

Spring IoC-konteyneri sizga boshqarish zarur bo'lgan har qanday klassni boshqarishi mumkin. U haqiqiy JavaBeans bilan cheklanmagan. Ko'pchilik Spring foydalanuvchilari default konstruktoridan (parametrsiz) foydalanishlarini afzal ko'radilar, va mos keluvchi setlar va getlar kontiner xususiyatlariga asoslangan modelda yaratishadi. Sizning konteyneringizda noan'anaviy klasslar, beans uslubida bo'lmaganlar ham mavjud bo'lishi mumkin. Masalan, agar eski xotira havzasini foydalanish kerak bo'lsa, u JavaBean spetsifikatsiyasi bilan mos kelmasa ham, Spring uni ham boshqarishi mumkin.

XML asosidagi konfiguratsion metama'lumotlar yordamida bean klassingizni quyidagi tarzda belgilashingiz mumkin:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>

Konstruktor argumentlarini (agar kerak bo'lsa) taqdim etish va obyekt qurilganidan keyin uning xususiyatlarini o'rnatish mexanizmi haqida Bog'liqliklarni joylash bo'limida batafsil ma'lumot oling.

Statik fabrika metodi yordamida instansiya yaratish

Statik fabrika metodi orqali yaratilgan bean aniqlanishida, faqat xizmatlar metodini o'rnatish uchun factory-method atributini ishlatasiz. Ushbu metodni chaqira olish qobiliyatingiz bo'lishi kerak (quyida ko'rsatilganidek, ixtiyoriy argumentlar bilan) va keyinchalik ishlaydigan ob'ektni qaytarishingiz mumkin, go'yo u konstruktor yordamida yaratilgan kabi. Bunday bean aniqlanishi uchun ba'zi ilovalar mavjud bo'lib, ularni eski kodda statik fabrikalarni chaqirish uchun ishlatishingiz mumkin.

Quyidagi bean aniqlanishida, bean fabrika metodini chaqirish orqali yaratiladi. Aniqlanishda qaytarilgan obyektning turi (klass) emas, faqat fabrika metodini o'z ichiga olgan klass ko'rsatilgan. Ushbu misolda createInstance() metodi statik bo'lishi kerak. Quyidagi misolda qanday qilib fabrika metodini belgilash mumkinligi ko'rsatilgan:

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>

Quyidagi misolda, oldingi bean aniqlash bilan ishlaydigan klass ko'rsatilgan:

Java
public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}
    public static ClientService createInstance() {
        return clientService;
    }
}
Kotlin
class ClientService private constructor() {
    companion object {
        private val clientService = ClientService()
        @JvmStatic
        fun createInstance() = clientService
    }
}

Fabrika metodiga (ixtiyoriy) argumentlar taqdim etish va obyekt fabrika tomonidan qaytarilgandan keyin uning xususiyatlarini o'rnatish mexanizmi haqida batafsil ma'lumot oling.

Instantsiyaning fabrika metodini yordamida yaratilishi

Statik fabrika metodi orqali yaratishga o'xshash, instantsiyaning fabrika metodini yordamida yaratish mavjud bean-dan konteynerdan yangi bean yaratish uchun nostatik metodni chaqirishni talab qiladi. Ushbu mexanizmdan foydalanish uchun class atributini bo'sh qoldirib, factory-bean atributida konteynerda (yoki ota-bobada) mavjud bo'lgan bean ismini ko'rsating, bu obyektni yaratish uchun chaqiriladigan metodni o'z ichiga oladi. Fabrika metodining o'zini factory-method atributi bilan belgilang. Quyidagi misolda bunday bean qanday konfiguratsiyalanganligi ko'rsatilgan:

<!-- createInstance() metodini o'z ichiga olgan fabrika bean -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- Ushbu bean-lokator uchun zarur bo'lgan har qanday bog'liqliklarni joylashtirish -->
</bean>
<!-- fabrika bean yordamida yaratiladigan bean -->
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>

Quyidagi misolda, mos klass ko'rsatilgan:

Java
public class DefaultServiceLocator {
    private static ClientService clientService = new ClientServiceImpl();
    public ClientService createClientServiceInstance() {
        return clientService;
    }
}
Kotlin
class DefaultServiceLocator {
    companion object {
        private val clientService = ClientServiceImpl()
    }
    fun createClientServiceInstance(): ClientService {
        return clientService
    }
}

Bitta fabrika klassi bir nechta fabrika metodlarini o'z ichiga olishi mumkin, quyidagi misolda ko'rsatilganidek:

<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- Ushbu bean-lokator uchun zarur bo'lgan har qanday bog'liqliklarni joylashtirish -->
</bean>
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>
<bean id="accountService"
    factory-bean="serviceLocator"
    factory-method="createAccountServiceInstance"/>

Quyidagi misolda, mos klass ko'rsatilgan:

Java
public class DefaultServiceLocator {
    private static ClientService clientService = new ClientServiceImpl();
    private static AccountService accountService = new AccountServiceImpl();
    public ClientService createClientServiceInstance() {
        return clientService;
    }
    public AccountService createAccountServiceInstance() {
        return accountService;
    }
}
Kotlin
class DefaultServiceLocator {
    companion object {
        private val clientService = ClientServiceImpl()
        private val accountService = AccountServiceImpl()
    }
    fun createClientServiceInstance(): ClientService {
        return clientService
    }
    fun createAccountServiceInstance(): AccountService {
        return accountService
    }
}

Ushbu yondashuv shuni ko'rsatadiki, o'zi ekan fabrika bean'ni boshqarish va uni bog'liqliklar joylashtirish (DI) yordamida sozlash mumkin. "Bog'liqliklar va konfiguratsiya haqida batafsil" bo'limiga qarang.

Spring hujjatida "fabrika bean" degan narsa Spring konteynerida konfigiratsiyalangan bean'ni bildirib, u instance yoki static fabrika metodini ishlatish orqali obyektlar yaratadi. Va aksincha, FactoryBean (katta harflardan foydalanishga e'tibor bering) Spring uchun maxsus klass bo'lib, FactoryBean implementatsiya klassini anglatadi.

Bean turini ijro etishda aniqlash

Ijro etishda aniq bean turini aniqlash murakkab vazifa. Bean aniqlash metama'lumotidagi berilgan klass - bu faqat boshlang'ich klassga yo'naltirilgan havola bo'lib, e'lon qilinmagan fabrika metodi bilan birlashtirilgan yoki FactoryBean klassi bo'lishi mumkin, bu ijro etishda boshqa bean turiga olib kelishi mumkin, yoki umuman belgilanmagan bo'lishi mumkin, agar fabrika metodining instansiya darajasida bo'lsa (bu o'rniga factory-bean nomi bilan belgilanadi). Bundan tashqari, AOP proksilash bean'ni interfeysga asoslangan proksiga joylashtirish orqali haqiqiy maqsadli bean turini cheklaydi (faqat uning amalga oshirilgan interfeyslari).

Ma'lum bir bean ijro etish vaqtida haqiqiy turini bilish uchun tavsiya etilgan usul BeanFactory.getType ni berilgan bean nomi uchun chaqirishdir. Ushbu barcha holatlar hisobga olinadi va BeanFactory.getBean chaqiruvidan qaytariladigan obyekt turi qaytariladi.

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