Wstrzykiwanie zależności (dependency injection)

Jak to fajnie ujął James Shore – “Dependency Injection” is a 25-dollar term for a 5-cent concept„. Co w wolnym tłumaczeniu oznacza, że wstrzykiwanie zależności posiada bardzo skomplikowaną nazwą na coś co jest w gruncie rzeczy proste. Chodzi o to, żeby dostarczać obiektowi jego zmienne, zamiast tworzyć je wewnątrz obiektu:

Przykład pierwszy

Już na pierwszy rzut oka ta klasa wygląda podejrzanie – ma od razu zainicjalizowane zmienne:

class Person {
    private String name = "John";
    private String surname = "Doe";
}


Wersja która wspiera wstrzykiwanie zależności to po prostu klasa posiadająca konstruktor, który przyjmuje imię i nazwisko (lub też posiada settery). Nic szczególnego (na codzień wielokrotnie używamy wstrzykiwania zależności) :

class Person {
    private String name;
    private String surname;

    Person(String name, String surname){
        this.name = name;
        this.surname = surname;
    }
}

Przykład drugi

Częściej koncept wstrzykiwania zależności wykorzystywany jest do obsługi jakichś czynności – przykładowo zapisu do bazy danych:

class PersonService{
    private PersonRepository repository = new OraclePersonRepository();

    public getPerson(String name){
        this.repository.getPersonByName(name);
    }
}

Przejście do wersji wspierającej wstrzykiwanie zależności, będzie równie proste jak w poprzednim przykładzie:

class PersonService{
    private PersonRepository repository;

    PersonService(PersonRepository repository){
        this.repository = repository;
    }

    public getPerson(String name){
        this.repository.getPersonByName(name);
    }
}