Jakie rodzaje wstrzykiwania zależności znasz?
sobes.tech AI
Odpowiedź od AI
Istnieją trzy główne typy:
-
Wstrzykiwanie przez pole (Field Injection): Zależność jest wstrzykiwana bezpośrednio do pola klasy za pomocą adnotacji (np.
@Autowiredw 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(); } } -
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(); } } -
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.