JavaRush /Kurslar /All lectures for UZ purposes /Konstruktor asosidagi dependency injection

Konstruktor asosidagi dependency injection

All lectures for UZ purposes
Daraja, Dars
Mavjud

Konstruktor asosidagi DI konteyner tomonidan argumentlar qatori bilan konstruktorni chaqirish orqali bajariladi, har biri dependencyni ifodalaydi. Statik factory metodini belgili argumentlar bilan bean yaratish uchun chaqirish deyarli ekvivalent hisoblanadi va bu tahlilda konstruktor va statik factory metodi argumentlari bir xil ko'rib chiqiladi. Quyidagi misolda, faqat konstruktor orqali dependency kiritilishi mumkin bo'lgan klass ko'rsatilgan:

Java
public class SimpleMovieLister {
    // SimpleMovieLister kinofinder dependencyga ega
    private final MovieFinder movieFinder;
    // Spring konteyner MovieFinderni kiritishi uchun konstruktor
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
    // Kiritilgan MovieFinderni haqiqatan ishlatadigan biznes logikasi chiqarib tashlangan...
}
Kotlin
// Spring konteyner MovieFinderni kiritishi uchun konstruktor
class SimpleMovieLister(private val movieFinder: MovieFinder) {
    // Kiritilgan MovieFinderni haqiqatan ishlatadigan biznes logikasi chiqarib tashlangan...
}

Ushbu classda maxsus narsa yo'qligiga e'tibor bering. Bu POJO (oddiy Java tili obyekti) bo'lib, konteynerning aniq interfeyslariga, asosiy classlariga yoki annotatsiyalariga qaramay ishlaydi.

Konstruktor argumentlarining aniqlanishi

Konstruktor argumentining aniqlanishi argument turi yordamida amalga oshiriladi. Agar bean aniqlanish konstruktor argumentlarida potentsial noaniqlik mavjud bo'lmasa, bean yaratilayotganda argumentlar konstruktorga o'sha tartibda o'tkaziladi. Quyidagi classni ko'rib chiqing:

Java
package x.y;
public class ThingOne {
    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}
Kotlin
package x.y
class ThingOne(thingTwo: ThingTwo, thingThree: ThingThree)

Agar ThingTwo va ThingThree klasslari vorislik bilan bog'lanmagan deb faraz qilsak, potentsial noaniqlik paydo bo'lmaydi. Shu sababli, quyidagi konfiguratsiya yaxshi ishlaydi va konstruktor argumentlari elementida <constructor-arg/> indekslari yoki turlarini aniq ko'rsatishga hojat yo'q.

<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>
    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

Agar boshqa bean uchun link berilsa, unda turi ma'lum bo'ladi, shuning uchun moslashuv paydo bo'lishi mumkin (avvalgi misolda bo'lgani kabi). Agar oddiy tur, masalan, <value>true</value> ishlatilsa, Spring qiymat turini aniqlay olmaydi, shuning uchun uchinchi taraf yordamisiz moslashtirishni amalga oshira olmaydi. Quyidagi classni ko'rib chiqing:

Java
package examples;
public class ExampleBean {
    // Yakuniy javobni hisoblash uchun yillar soni
    private final int years;
    // Hayot, olam va shunga o'xshashning asosiy savolga javobi
    private final String ultimateAnswer;
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}
Kotlin
package examples
class ExampleBean(
    private val years: Int, // Yakuniy javobni hisoblash uchun yillar soni
    private val ultimateAnswer: String // Hayot, olam va shunga o'xshashning asosiy savolga javobi
)
Konstruktor argumentlari turlarini moslashtirish

Oldingi vaziyatda konteyner oddiy turlarga moslashishni amalga oshirishi mumkin, agar konstruktor argumenti turi type atributi yordamida ochiq ko'rsatilgan bo'lsa, quyidagi misolda ko'rsatilgani kabi:

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>
Konstruktor argumenti indeksi

Konstruktor argumentlarining indekslarini aniq ko'rsatish uchun index atributidan foydalanishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>

Ko'pchilik oddiy qiymatlar noaniqligini bartaraf etishdan tashqari, indekslarni ko'rsatish, agar konstruktor ikki bir xil turdagi argumentga ega bo'lsa, noaniqlikni hal qiladi.

Indeks 0 dan boshlanadi (0 dan boshlayotgan hisoblanadi).
Konstruktor argumentining nomi

Qiymatlar noaniqligini bartaraf qilish uchun konstruktor parametri nomini ham ishlatishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>

Bu "quti ichidan" ishlashi uchun, kod debug flagi yoqilgan holda kompilyatsiya qilinishi kerak, shunda Spring konstruktor parametr nomini topishi mumkin. Agar siz kodni debug flagi bilan kompilyatsiya qilolmaysiz yoki xohlamasangiz, unda JDK @ConstructorProperties annotatsiyasidan foydalanib, konstruktor argumentlaringiz nomlarini ochiq ko'rsatsangiz bo'ladi. Unda classdan namuna quyidagi ko'rinishda bo'lishi kerak:

Java
package examples;
public class ExampleBean {
    // Fields chiqarib tashlangan
    @ConstructorProperties({"years", "ultimateAnswer"})
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}
Kotlin
package examples
class ExampleBean
@ConstructorProperties("years", "ultimateAnswer")
constructor(val years: Int, val ultimateAnswer: String)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION