Sobes.tech
Middle

Faqat konstruktor orqali emas, balki bog'liqliklarni ham kiritish mumkinmi?

sobes.tech AI

AIdan javob

Ha, mumkin. Konstruktor orqali bog'liqliklarni in'ektsiya qilish (Constructor-based dependency injection) bilan bir qatorda, Spring Frameworkda quyidagi asosiy usullar mavjud:

  1. Setter orqali in'ektsiya (Setter-based dependency injection): Bog'liqliklar ochiq metod-setterlar orqali in'ektsiya qilinadi.

    public class MyClass {
        private Dependency dependency;
    
        public void setDependency(Dependency dependency) {
            this.dependency = dependency;
        }
    
        // ... boshqa metodlar
    }
    
  2. Maydon orqali in'ektsiya (Field-based dependency injection): Bog'liqliklar to'g'ridan-to'g'ri sinf maydonlariga anotatsiyalar yordamida (masalan, @Autowired) in'ektsiya qilinadi. Bu usul eng keng tarqalgan, ammo o'z kamchiliklari bor (masalan, birlik testlari uchun qiyinchilik va yashirin bog'liqlik).

    public class MyClass {
        @Autowired
        private Dependency dependency;
    
        // ... boshqa metodlar
    }
    
  3. Metodlar orqali in'ektsiya (Method-based dependency injection): Kamroq keng tarqalgan usul bo'lib, bog'liqliklar har qanday @Autowired bilan belgilangan metod orqali in'ektsiya qilinadi.

    public class MyClass {
        private Dependency dependency;
    
        @Autowired
        public void configure(Dependency dependency) {
            this.dependency = dependency;
        }
    
        // ... boshqa metodlar
    }
    

Usul tanlovi aniq holat va afzalliklarga bog'liq. Konstruktor orqali in'ektsiya odatda afzal ko'riladi, chunki u ob'ektni barcha zarur bog'liqliklar bilan yaratishni ta'minlaydi va test qilishni osonlashtiradi. Biroq, maydonlar yoki setterlar orqali in'ektsiya, opsional bog'liqliklar uchun yoki legacy-kod bilan ishlashda qulayroq bo'lishi mumkin.