Dependency injection innebär att du skickar beroenden istället för att låta "den beroende delen" (en klasskonstruktor, en metod; i andra språk funktioner, moduler etc.) skapa eller leta efter dem själv.
Utan dependency injection:
class Korv {
private final Bröd bröd;
public Korv() {
this.bröd = new Knäckebröd(); // beroendet skapas inuti klassen
}
}
// användning:
Korv korv = new Korv();
Med dependency injection:
class Korv {
private final Bröd bröd;
public Korv(Bröd bröd) {
this.bröd = bröd; // beroendet skickas in av den som instansierar klassen
}
}
// användning:
Bröd bröd = new GlutenfrittBröd(); // GlutenfrittBröd ärver Bröd;
Korv korv = new Korv(bröd);
Det är det hela.
Det Dagger, Guice, Spring DI etc. tillför är olika metodiker för att automagiskt göra precis det jag skrev i exemplet ovan.