Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

LetsGit.IT/Kategorie/Spring
Springeasy

Co to jest Dependency Injection w Springu i czemu preferować constructor injection?

Tagi
#di#ioc#constructor-injection
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Spring tworzy obiekty (beany) i wstrzykuje im zależności, więc kod nie skleja wszystkiego ręcznie. Wstrzykiwanie przez konstruktor jest jawne, wspiera niemutowalność (`final`) i jest najłatwiejsze do testowania.

@Service
class UserService {
  private final UserRepository repo;

  UserService(UserRepository repo) {
    this.repo = repo;
  }
}

Odpowiedź zaawansowana

Głębiej

Dependency Injection (DI) to wzorzec, w którym zewnętrzny kontener (Spring) tworzy obiekty i dostarcza im zależności. W Springu robi to kontener IoC (ApplicationContext): tworzy beany, rozwiązuje wiring, zarządza cyklem życia i dokleja mechanizmy przekrojowe (AOP, transakcje, security).

Constructor injection jest preferowane, bo:

  • **Zależności są jawne**: jeśli kod się kompiluje, wymagane zależności są dostarczone.
  • **Niemutowalność**: pola mogą być `final` i inicjalizowane raz.
  • **Testowalność**: w testach jednostkowych możesz zrobić `new` bez Springa.
  • **Fail fast**: brakujący bean wychodzi na jaw przy starcie, a nie w runtime.

Praktyka

  • Konstruktor dla zależności wymaganych.
  • Dla zależności opcjonalnych: `Optional<T>` / `ObjectProvider<T>` albo rozdziel odpowiedzialności.
  • Jeśli konstruktor ma „za dużo” argumentów, to często sygnał zbyt dużej klasy.

Przykład

@Service
class UserService {
  private final UserRepository repo;
  private final Clock clock;

  UserService(UserRepository repo, Clock clock) {
    this.repo = repo;
    this.clock = clock;
  }
}

Typowe pułapki

Powiązane pytania

Spring
BeanFactory vs ApplicationContext: jaka jest praktyczna różnica?
#spring#ioc#applicationcontext
Spring
`@Qualifier` vs `@Primary`: jak rozstrzygają wiele beanów?
#spring#di#qualifier
Spring
Czym jest Spring `ApplicationContext` (w jednym zdaniu)?
#spring#ioc
Field injection ukrywa zależności i utrudnia testy.
  • Zależności cykliczne trudniej obejść konstruktorami (i dobrze — to ujawnia problem w projekcie).
  • Mieszanie ręcznego `new` z beanami Springa (tracisz proxy i mechanikę lifecycle).
  • #applicationcontext
    Spring
    Co to jest wstrzykiwanie zależności?
    #di#inversion-of-control#spring