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

Setter asosidagi dependency injection

All lectures for UZ purposes
Daraja, Dars
Mavjud

Setter asosidagi DI container tomonidan beanlarni yaratish uchun argumentlarsiz konstruktor yoki argumentlarsiz statik fabrika metodini chaqirgandan so‘ng, beanlar uchun set terlarn i chaqirish orqali amalga oshiriladi.

Quyidagi misolda dependency faqatgina setter orqali inject qilinadigan klass ko'rsatilgan. Ushbu klass oddiy Java klass hisoblanadi. Bu POJO (oddiy Java obyekt), u aniq container interfeyslari, bazaviy klasslar yoki annotatsiyalarga bog'liq emas.

Java
public class SimpleMovieLister {
    // SimpleMovieLister MovieFinder ga bog'liq
    private MovieFinder movieFinder;
    // Spring container MovieFinder ni kiritishga imkon beradigan setter
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
    // Business-logic, u haqiqatda inject qilingan MovieFinder ni ishlatadi... (tushirib qoldirilgan)
}
Kotlin
class SimpleMovieLister {
    // Kechiktirilgan initsializatsiya xususiyati, Spring container MovieFinder ni inject qilishi mumkin
    lateinit var movieFinder: MovieFinder
    // Business-logic, u haqiqatda inject qilingan MovieFinder ni ishlatadi... (tushirib qoldirilgan)
}

ApplicationContext tomonidan boshqarilgan beanlar uchun konstruktor asosida DI va setter asosida DI ni qo‘llab-quvvatlaydi. U shuningdek, ba'zi dependency lar allaqachon konstruktor yondashuvi yordamida inject qilinganidan so'ng, setter asosida DI ni qo‘llab-quvvatlaydi. Siz BeanDefinition shaklida dependency ni sozlaysiz, ular bilan siz xususiyatlarni bir formatdan boshqasiga aylantirish uchun PropertyEditor instansiyalari bilan foydalanasiz. Biroq, Spring foydalanuvchilarining aksariyati ushbu klasslar bilan to' g'ridan-to'g'ri (dasturiy), balkim XML bean ta'riflari bilan, annotatsiyalangan komponentlar bilan (ya'ni @Component, @Controller va hokazo annotatsiyalangan klasslar), yoki @Bean annotatsiyalangan metodlar bilan ish olib borishadi, Java asosidagi @Configuration annotatsiyalangan klasslarda. Keyin ushbu manbalar ichki ravishda BeanDefinition instansiyalariga aylantiriladi va Spring ning IoC container ini yuklash uchun ishlatiladi.

Konstruktor asosida DI yoki setter asosida DI?

Konstruktor asosida DI va setter asosida DI ni aralashtirish mumkinligi sababli, yaxshi amaliy qoidaga muvofiq, majburiy dependency lar uchun konstruktorlardan va ixtiyoriy dependency lar uchun setterlardan yoki konfiguratsiya metodlardan foydalanishdir. Setterda @Required annotatsiyasidan foydalanish mulkni kerakli dependency ga aylantirish uchun amalga oshirilishi mumkin; ammo konstruktor orqali inject qilish va argumentlarni dasturiy tekshirish afzalroqdir.

Spring jamoasi umuman olganda konstruktor orqali inject qilishni qo‘llab-quvvatlaydi, chunki bu dasturning komponentlarini o‘zgarmas obyektlar shaklida amalga oshirishga va kerakli dependency lar null emasligiga ishonch hosil qiladi. Bundan tashqari, konstruktor orqali inject qilingan komponentlar har doim to‘liq initsializatsiya qilingan holatda mijoz (chaqiruvchi) kodga qaytariladi. Qayd etish kerakki, ko‘p sonli konstruktor argumentlarining mavjudligi kodda muammo borligini ko‘rsatadi (code smell), bu klassning ehtimol haddan tashqari yuklanganligini va vazifalarni yanada yaxshi taqsimlash uchun refaktoringga muhtojligini ko‘rsatadi.

Setter orqali inject qilish asosan faqatgina sinfda mantiqiy standart qiymatlarni berish mumkin bo‘lgan ixtiyoriy dependency lar uchun ishlatilishi kerak. Aks holda, dependency kodda ishlatilgan joyda not-null tekshiruvi amalga oshirilishi kerak. Setter orqali inject qilishning bir afzalligi shundaki, o‘rnatish metodlari ushbu klassdagi obyektlarni qayta konfiguratsiya qilish yoki qayta inject qilish uchun mos qiladi. Shuning uchun JMX MBeans orqali boshqarish setter orqali inject qilish uchun tegishli misoldir.

Aniq bir klass uchun eng mos DI uslubidan foydalaning. Ba'zan, agar sizda xom kod mavjud bo‘lmagan uchinchi tomon klasslari haqida gapirayotgan bo‘lsangiz, tanlov siz uchun qilinadi. Masalan, agar uchinchi tomon klassi hech qanday o‘rnatish metodlarini ochmasa, unda konstruktor orqali inject qilish dependency ni inject qilishning yagona mavjud shakli bo‘ladi.

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