JavaRush /Kurslar /All lectures for UZ purposes /IoC-konteyner nusxasini yaratish

IoC-konteyner nusxasini yaratish

All lectures for UZ purposes
Daraja, Dars
Mavjud

ApplicationContext konstruktoriga uzatilayotgan yo'l yoki yo'llar resurs qatorlari bo'lib, konteynerga mahalliy fayl tizimi, Java CLASSPATH va shunga o'xshash turli tashqi resurslardan yuklash imkonini beradi.

Java
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
Kotlin
val context = ClassPathXmlApplicationContext("services.xml", "daos.xml")

Spring IoC-konteynerini o'rganganingizdan so'ng, Spring Resource abstraksiyasi haqida ko'proq bilishni xohlashingiz mumkin, bu URI sintaksisida belgilangan joylardan InputStream o'qishning qulay mexanizmini taqdim etadi. Ayniqsa, Resource yo'llari dastur kontekstlarini tuzish uchun ishlatiladi.

Quyidagi misolda xizmat darajasidagi ob'ektlar konfiguratsiya fayli (services.xml) ko'rsatilgan:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- xizmatlar -->
    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- qo'shimcha o'zaro bog'liq ob'ektlar va bu bin uchun konfiguratsiya bu yerda joylashgan -->
    </bean>
    <!-- xizmatlar uchun ko'proq bin aniqlovlari bu yerda joylashgan -->
</beans>

Quyidagi misolda ma'lumotlarga kirish ob'ektlari fayli daos.xml ko'rsatilgan:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- qo'shimcha o'zaro bog'liq ob'ektlar va bu bin uchun konfiguratsiya bu yerda joylashgan -->
    </bean>
    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- qo'shimcha o'zaro bog'liq ob'ektlar va bu bin uchun konfiguratsiya bu yerda joylashgan -->
    </bean>
    <!-- ma'lumotlarga kirish ob'ektlari uchun ko'proq bin aniqlovlari bu yerda joylashgan -->
</beans>

Oldingi misolda xizmat darajasi PetStoreServiceImpl klassidan va ikki turdagi ma'lumotlarga kirish ob'ektlaridan, ya'ni JpaAccountDao va JpaItemDao dan iborat (JPA Object-Relational Mapping standarti asosida). property name elementi JavaBean xususiyat nomiga ishora qiladi, ref elementi esa boshqa bir bin aniqloviga ishora qiladi. id va ref elementlari orasidagi bu bog'lanish o'zaro bog'liq ob'ektlar orasidagi bog'lanishni bildiradi.

XML asosidagi konfiguratsiya metama'lumotlarini yaratish

Agar bin aniqlovlari bir nechta XML-fayllarni qamrab olsa, bu foydali bo'lishi mumkin. Odatda, har bir alohida XML-konfiguratsiya fayli arxitekturadagi mantiqiy daraja yoki modulni ifodalaydi.

Barcha bu XML-parchalardan bin aniqlovlarini yuklash uchun dastur konteksti konstruktoridan foydalanishingiz mumkin. Ushbu konstruktor bir necha Resource joylarini qabul qiladi. Shu bilan bir qatorda, boshqa fayldan yoki fayllardan bin aniqlovlarini yuklash uchun bir yoki bir nechta elementlar kirishini ishlating. Quyidagi misolda buni qanday qilish kerakligi ko'rsatilgan:

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>
    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

Oldingi misolda uchta fayldan, ya'ni services.xml, messageSource.xml va themeSource.xml dan tashqi bin aniqlovlari yuklanadi. Barcha joylashuv yo'llari import qilinayotgan faylga tegishli, shuning uchun services.xml ham import qilinayotgan fayl bilan bir xil katalogda yoki classpathda bo'lishi kerak, messageSource.xml va themeSource.xml esa import qilinayotgan fayldan pastdagi resourcesda joylashgan bo'lishi kerak. Ko'rib turganingizdek, boshlang'ich qiya chiziq inobatga olinmaydi. Biroq, bu yo'llar nisbiy ekanini hisobga olsak, umuman chiziqni ishlatmaslik yaxshiroqdir. Import qilingan fayllarning mazmuni, jumladan yuqori darajadagi <bean/> elementi, Spring Schema bo'yicha haqiqiy XML-bin aniqlovi bo'lishi kerak.

Relative yo'l "../" yordamida ota kataloglardagi fayllarga murojaat qilish mumkin, lekin tavsiya etilmaydi. Bu joriy dasturning chegarasidan tashqarida joylashgan faylga bog'liklikni yaratadi. Ayniqsa, classpath: uchun bunday ma'lumotnomani ishlatish tavsiya etilmaydi (masalan, classpath:../services.xml), bu erda ishga tushirish jarayonida eng yaqin classpath ildizi tanlanadi, so'ngra uning ota katalogi ko'rib chiqiladi. Classpath yo'l konfiguratsiyasini o'zgartirish natijasida noto'g'ri katalog tanlanishi mumkin.

Siz har doim nisbiy yo'llar o'rniga resurslarning to'liq aniqlangan joylashuvini ishlatishingiz mumkin: masalan, file:C:/config/services.xml yoki classpath:/config/services.xml. Biroq, unutmangki, siz dasturning konfiguratsiyasini aniq mutlaq joylarga bog'laysiz. Odatda bunday mutlaq joylar uchun bilvosita adresatsiyani saqlash ma'qulroq - masalan, JVM tizim xususiyatlariga nisbatan ishga tushirish paytida hal qilinadigan "${....}" placeholderlari orqali.

O'zi ham namespace import direktivani ishlatish imkoniyatini taqdim etadi. Bin aniqlovlaridan tashqari qo'shimcha konfiguratsiya imkoniyatlari Spring tomonidan taqdim etilgan ba'zi XML namespacesda mavjud (masalan, context va util namespaceslari).

Groovy DSL yordamida bin aniqlash

Qo'shimcha ma'lumotlar misoli sifatida, konfiguratsiyasi tashqi faylga ajratilgan holda, binlar Groovy DSL orqali Springda aniqlanishi mumkin, bu Grails freymvorkidan ma'lum. Odatda bunday konfiguratsiya ".groovy" faylida joylashgan bo'lib, quyidagi misolda ko'rsatilgan tuzilishga ega:

beans {
    dataSource(BasicDataSource) {
        driverClassName = "org.hsqldb.jdbcDriver"
        url = "jdbc:hsqldb:mem:grailsDB"
        username = "sa"
        password = ""
        settings = [mynew:"setting"]
    }
    sessionFactory(SessionFactory) {
        dataSource = dataSource
    }
    myService(MyService) {
        nestedBean = { AnotherBean bean ->
            dataSource = dataSource
        }
    }
}

Bu konfiguratsiya uslubi juda ko'p jihatdan XML-bin aniqlovlariga teng keladi va hattoki Spring konfiguratsiyasi XML namespacelarni ham qo'llab-quvvatlaydi. Shuningdek, importBeans direktivasi orqali XML-bin aniqlovlar fayllarini import qilish imkonini beradi.

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