Sobes.tech
Junior

Jakie rodzaje wstrzykiwania zależności znasz?

sobes.tech AI

Odpowiedź od AI

Istnieją trzy główne typy:

  1. Wstrzykiwanie przez pole (Field Injection): Zależność jest wstrzykiwana bezpośrednio do pola klasy za pomocą adnotacji (np. @Autowired w Spring). Jest to łatwe w użyciu, ale utrudnia testowanie jednostkowe i narusza zasadę pojedynczej odpowiedzialności, ukrywając zależności.

    // Przykład wstrzykiwania przez pole
    public class MyService {
        // Zależność jest wstrzykiwana bezpośrednio do pola
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Wstrzykiwanie przez setter (Setter Injection): Zależność jest wstrzykiwana przez publiczną metodę settera. Pozwala na opcjonalne ustawienie zależności (nie jest obowiązkowe), jest wygodne do zmiany zależności w czasie działania (choć rzadko używane). Nie tworzy obowiązkowej zależności podczas tworzenia obiektu.

    // Przykład wstrzykiwania przez setter
    public class MyService {
        private MyRepository repository;
    
        // Zależność jest wstrzykiwana przez setter
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Wstrzykiwanie przez konstruktor (Constructor Injection): Zależność jest wstrzykiwana przez argument konstruktora. Jest to preferowane, ponieważ zapewnia, że zależność jest obowiązkowa (bez niej obiekt nie może być utworzony), ułatwia testowanie jednostkowe (łatwo przekazać mocki) i jasno deklaruje potrzeby klasy. Czyni obiekty niezmiennymi po utworzeniu, jeśli pola są final.

    // Przykład wstrzykiwania przez konstruktor
    public class MyService {
        private final MyRepository repository; // Pole może być final
    
        // Zależność jest wstrzykiwana przez konstruktor
        @Autowired // W nowszych wersjach Spring można pominąć tę adnotację, jeśli jest tylko jeden konstruktor
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Tabela porównawcza:

Typ wstrzykiwania Obowiązkowość zależności Łatwość użycia Testowalność Niezmienność
Przez pole Opcjonalne (ukryte) Wysoka Niska Nie
Przez setter Opcjonalne Średnia Średnia Nie
Przez konstruktor Obowiązkowe Średnia Wysoka Możliwa

W większości przypadków zaleca się używanie wstrzykiwania przez konstruktor.