Sobes.tech
Junior

Milyen függőséginjektálási típusokat ismer?

sobes.tech MI

Válasz az MI-től

Három fő típus létezik:

  1. Mezőinjektálás (Field Injection): A függőség közvetlenül a osztály mezőjébe injektálódik annotációval (például @Autowired Springben). Egyszerű használni, de megnehezíti az egységtesztelést és sérti az egy felelősség elvét, elrejtve a függőségeket.

    // Példa mezőinjektálásra
    public class MyService {
        // A függőség közvetlenül a mezőbe injektálódik
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Setterenjektálás (Setter Injection): A függőség nyilvános setter metóduson keresztül injektálódik. Opcionális, nem kötelező, kényelmes a függőségek futás közbeni módosítására (bár ritkán használják). Nem hoz létre kötelező függőséget az objektum létrehozásakor.

    // Setterenjektálás példája
    public class MyService {
        private MyRepository repository;
    
        // A függőség setteren keresztül injektálódik
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Konstruktorinjektálás (Constructor Injection): A függőség a konstruktor argumentumán keresztül injektálódik. Előnyös, mert garantálja, hogy a függőség kötelező ( nélküle az objektum nem hozható létre), megkönnyíti az egységtesztelést (könnyű mock-okat átadni), és világosan deklarálja az osztály igényeit. Az objektumok, ha a mezők finalok, változatlanok maradnak a létrehozás után.

    // Konstruktorinjektálás példája
    public class MyService {
        private final MyRepository repository; // A mező lehet final
    
        // A függőség a konstruktoron keresztül injektálódik
        @Autowired // A Spring újabb verzióiban ez az annotáció elhagyható, ha csak egy konstruktor van
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Összehasonlító táblázat:

Injektálási típus Függőség kötelező Használat egyszerűsége Tesztelhetőség Változtathatóság
Mezőn keresztül Opcionális (rejtett) Magas Alacsony Nem
Setteren keresztül Opcionális Közepes Közepes Nem
Konstruktoron keresztül Kötelező Közepes Magas Lehetséges

A legtöbb esetben ajánlott a konstruktoron keresztüli injektálás használata.