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();
        }
    }
    

შედარებითი სია:

ტიპი აუცილებლობა გამოყენების სიმარტივე ტესტირებადობა უცვლელობა
ველის საშუალებით არჩევითი მაღალი დაბალი არა
სეტერის საშუალებით არჩევითი საშუალო საშუალო არა
კონსტრუქტორის საშუალებით აუცილებელი საშუალო მაღალი შესაძლებელია

მთავარი რეკომენდაციაა, გამოიყენოთ კონსტრუქტორის საშუალებით ინექცია.