Koje vrste injekcije zavisnosti poznajete?
sobes.tech АИ
Одговор од АИ
Postoje tri osnovne vrste:
-
Ubacivanje putem polja (Field Injection): Zavisnost se direktno ubacuje u polje klase pomoću anotacije (na primer,
@Autowiredu Springu). Jednostavno za korišćenje, ali otežava modularno testiranje i narušava princip jedinstvene odgovornosti, skrivajući zavisnosti.// Primer ubacivanja putem polja public class MyService { // Zavisnost se direktno ubacuje u polje @Autowired private MyRepository repository; public void doSomething() { repository.getData(); } } -
Ubacivanje putem setera (Setter Injection): Zavisnost se ubacuje putem javne metode-settera. Omogućava opcionalno postojanje zavisnosti (nije obavezno da se postavi), zgodno za promenu zavisnosti tokom izvršavanja (mada se retko koristi). Ne stvara obaveznu zavisnost pri kreiranju objekta.
// Primer ubacivanja putem setera public class MyService { private MyRepository repository; // Zavisnost se ubacuje putem setera @Autowired public void setRepository(MyRepository repository) { this.repository = repository; } public void doSomething() { repository.getData(); } } -
Ubacivanje putem konstruktora (Constructor Injection): Zavisnost se ubacuje putem argumenta konstruktora. Prednost je što obezbeđuje obaveznost zavisnosti (bez nje objekat ne može biti kreiran), olakšava modularno testiranje (lako je proslediti mock objekte) i jasno deklarise potrebe klase. Čini objekte nepromenljivim nakon kreiranja ako su polja
final.// Primer ubacivanja putem konstruktora public class MyService { private final MyRepository repository; // Polje može biti final // Zavisnost se ubacuje putem konstruktora @Autowired // U novijim verzijama Springa može se preskočiti anotacija @Autowired za jedini konstruktor public MyService(MyRepository repository) { this.repository = repository; } public void doSomething() { repository.getData(); } }
Uporedna tabela:
| Vrsta ubacivanja | Obaveznost zavisnosti | Jednostavnost korišćenja | Testabilnost | Nemogućnost menjanja |
|---|---|---|---|---|
| Preko polja | Opcionalno (skriveno) | Visoka | Niska | Ne |
| Preko setera | Opcionalno | Srednja | Srednja | Ne |
| Preko konstruktora | Obavezno | Srednja | Visoka | Moguće |
U većini slučajeva preporučuje se korišćenje ubacivanja putem konstruktora.