Unicodely

Logo unicodely software house

Wstrzykiwanie zależności w Spring – praktyczne wprowadzenie

Dependency injection - practical introduction

W tym artykule wyjaśnimy koncepcję Wstrzykiwania Zależności (DI) praktycznie i pokażemy, jak zastosować ją w kodzie przy użyciu platformy Spring Framework.

Wstęp

Wstrzykiwanie zależności jest jedną z dwóch głównych funkcjonalności Springa oprócz Inwersji Kontroli.

Poprawnie, Wstrzykiwanie Zależności (DI) jest realizacją zasady Inwersji Kontroli i jest obsługiwane przez Kontener Inwersji Kontroli w Springu.

Prawdopodobnie jest to najważniejszy element infrastruktury Springa.

Zasada loose coupling

DI to również zasada, która umożliwia zachowanie zasady luźnego powiązania programowania.

Zasada loose coupling jest istotna w nowoczesnych systemach, ponieważ zapewnia lepsze warunki do wprowadzania zmian w naszym oprogramowaniu.

Definicja

Wstrzykiwanie Zależności(Dependency Injection) (w skrócie – DI) to wzorzec projektowy, w którym obiekty nie inicjują swoich zależności samodzielnie, ale akceptują je z zewnątrz poprzez „wstrzykiwanie”.

Powodem, dla którego tego rodzaju inicjowanie obiektów jest właściwe, jest fakt, że między innymi łatwiej jest pisać testy jednostkowe.

DI to wzorzec realizujący zasadę IoC.

W wzorcu DI zależności są inicjowane przez framework, jeśli mówimy na przykład o Springu.

Wyjaśnienie

DI polega na przekazywaniu zależnego obiektu w sposób podobny do przekazywania parametrów do metody, zamiast używania metody do tworzenia zależnego obiektu.

Poniżej znajduje się wyjaśnienie oparte na przykładach kodu:

Tradycyjne podejście

Jeśli chcemy utworzyć obiekt w klasie, używamy słowa kluczowego new:

new ConcreteImpl();

Poniżej przedstawiono pełny przykład użycia obiektu w innej klasie:

public class Book {
private Cover cover;

public Book() {
    cover = new CrimeBookCover();    
}

}

W powyższym przykładzie podczas inicjowania musimy zdecydować się na konkretną implementację klasy Cover.

Istnieje możliwość, że mamy okładkę dla:

  • książki kryminalnej,
  • książki tutorialowej,
  • książki dla dzieci.

Główną wadą tego podejścia jest fakt, że musimy wybrać tylko jedną implementację na poziomie kodu, więc w przyszłości będzie trudno wprowadzić zmiany w całym oprogramowaniu.

Nie możemy przekazać innej implementacji klasy Cover (interfejsu lub klasy abstrakcyjnej) w konstruktorze. Kod nie jest luźno powiązany! Jest zdecydowanie silnie powiązany.

Istnieje lepszy sposób rozwiązania tego rodzaju problemów.

Podejście wstrzykiwania zależności

Korzystając z DI, możemy zmienić kod w taki sposób, że nie określamy konkretnej implementacji obiektu Cover.

public class Book {
private Cover cover;

public Book(Cover cover) {
    this.cover = cover;
}

}

W kolejnych akapitach przyjrzymy się innym sposobom zachowania wzorca Wstrzykiwania Zależności.

Wstrzykiwanie zależności w Springu

W tym artykule omawiamy tylko podstawowe sposoby dostarczania Wstrzykiwania Zależności w Springu. W następnym przedstawię szerszy zakres możliwości związanych z DI i Springiem.

Trzy rodzaje wstrzykiwania zależności (DI)

Obecnie, korzystając z kontenera Springa, nie ma powodu myśleć o DI, ponieważ Spring zrobi to za nas, w kilku prostych sposobach.

Istnieją trzy najczęstsze rodzaje DI:

  • wstrzykiwanie przez konstruktor,
  • wstrzykiwanie przez metodę (setter),
  • wstrzykiwanie przez pole (property).

Te rodzaje powiązań są wykonywane za pomocą adnotacji @Autowired.

Wstrzykiwanie przez konstruktor

Jeśli chcemy wstrzyknąć zależność w konstruktorze, musimy dodać adnotację @Autowired nad konstruktorem.

public class Book {
private Cover cover;

@Autowired
public Book(Cover cover) {
    this.cover = cover;
}
}

Wstrzykiwanie przez metodę (setter)

Jeśli chcemy wstrzyknąć zależność w metodzie setter, musimy dodać adnotację @Autowired nad metodą. Wstrzykiwanie przez setter jest rzadko używane i nie jest zalecane przez twórców Springa, ale warto wiedzieć, że coś takiego istnieje.

public class Book {
private Cover cover;

@Autowired
public void setCover(Cover cover) {
    this.cover = cover;
}

}

Wstrzykiwanie przez pole (property)

Jeśli chcemy wstrzyknąć zależność w polu, musimy dodać adnotację @Autowired nad polem.

public class Book {
@Autowired
private Cover cover;

public Book() {}

}

Podsumowanie

Jak widać, Wstrzykiwanie Zależności nie jest takie trudne. Mam nadzieję, że moje wyjaśnienie było wystarczające do zrozumienia (jeśli nie – wyślij mi wiadomość prywatną lub po prostu napisz komentarz, jeśli tak – możesz zrobić to samo).

Najważniejszą rzeczą do zapamiętania jest to, że największą zaletą korzystania z wzorca DI jest osiągnięcie luźno

Udostępnij wpis:
Dominik Nuszkiewicz
Dominik Nuszkiewicz