Sobes.tech
Junior

Ի՞նչ տեսակի կախվածության ներմուծում եք գիտակցում։

sobes.tech AI

Պատասխան AI-ից

Կան երեք հիմնական տեսակ:

  1. Մուտքագրում դաշտով (Field Injection): Զависությունը ուղղակիորեն մուտքագրվում է դասի դաշտը՝ օգտագործելով նշում (օրինակ, @Autowired Spring-ում): Հեշտ է օգտագործել, բայց բարդացնում է մոդուլային թեստավորումը և խախտում է միակ պատասխանատվության սկզբունքը՝ թաքցնելով կախվածությունները:

    // Դաշտով մուտքագրման օրինակ
    public class MyService {
        // Զависությունը ուղղակիորեն մուտքագրվում է դաշտ
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Մուտքագրում սեթերով (Setter Injection): Զависությունը մուտքագրվում է հանրային սեթեր մեթոդով: Հնարավոր է ընտրովի լինել (չպետք է պարտադիր լինի), հարմար է փոփոխել կախվածությունները ժամանակի ընթացքում (քանի որ հազվադեպ է օգտագործվում): Չստեղծում է պարտադիր կախվածություն՝ օբյեկտի ստեղծման ժամանակ:

    // Սեթերով մուտքագրում օրինակ
    public class MyService {
        private MyRepository repository;
    
        // Զависությունը մուտքագրվում է սեթով
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Կոնստրուկտորով մուտքագրում (Constructor Injection): Զависությունը մուտքագրվում է կոնստրուկտորի արգումենտով: Սա նախընտրելի է, քանի որ ապահովում է պարտադիր կախվածություն (անվան առանց դրա օբյեկտը չի կարող ստեղծվել), հեշտացնում է մոդուլային թեստավորումը (հեշտ է փոխանցել մոկ օբյեկտներ) և պարզորեն հայտարարում է դասի կարիքները: Օբյեկտները անփոփոխ են դարձնում ստեղծելուց հետո, եթե դաշտերը final են:

    // Կոնստրուկտորով մուտքագրում օրինակ
    public class MyService {
        private final MyRepository repository; // Դաշտը կարող է լինել `final`
    
        // Զависությունը մուտքագրվում է կոնստրուկտորով
        @Autowired // Նոր տարբերակներում Spring-ը կարող է անտեսել @Autowired նշումը միայն կոնստրուկտորի համար
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Համեմատական աղյուսակ:

Տեսակ մուտքագրում Զависության պարտադիրություն Օգտագործման պարզություն Թեստավորելիություն Անփոփոխություն
Դաշտով Ընտրովի (թաքնված) Բարձր Նվազ Ոչ
Սեթերով Ընտրովի Միջին Միջին Ոչ
Կոնստրուկտորով Պարտադիր Միջին Բարձր Մնարական

Ամենայն դեպքերում խորհուրդ է տրվում օգտագործել կոնստրուկտորով մուտքագրում։