Skip to content

[2026-03-06] Czy wiesz, że zależności w Springu powinniśmy wstrzykiwać przez konstruktor?#277

Open
sirtekyt wants to merge 1 commit intomasterfrom
zaleznosci-spring
Open

[2026-03-06] Czy wiesz, że zależności w Springu powinniśmy wstrzykiwać przez konstruktor?#277
sirtekyt wants to merge 1 commit intomasterfrom
zaleznosci-spring

Conversation

@sirtekyt
Copy link
Contributor

No description provided.

Wstrzykiwanie zależności przez konstruktor to najlepsza praktyka w aplikacjach Spring.
Zapewnia bezpieczeństwo, czytelność kodu, łatwość testowania i zgodność z zasadami SOLID.
Warto stosować to podejście zawsze, gdy to możliwe, a inne metody rezerwować dla szczególnych przypadków (opcjonalne zależności, legacy code).
Dzięki temu Twój kod będzie bardziej niezawodny i łatwiejszy w utrzymaniu.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

czekam na źródła @BartoszPietrowiak

*Adnotacja `@RequiredArgsConstructor` pochodzi z biblioteki Lombok i automatycznie generuje konstruktor przyjmujący wszystkie pola oznaczone jako `final`
lub z adnotacją `@NonNull`.*

- Wstrzykiwanie przez konstruktor z wykorzystaniem adnotacji `@RequiredArgsConstructor` oraz `@Qualifier`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ja bym usunął z tego wpisu te informacje o @qualifier. W tej postaci można odnieść wrażenie, że @qualifier działa tylko w tym konkretnym przypadku, podczas gdy można go użyć w pozostałych trybach czyli jawny konstruktor, settery i autowired.
Ewentualnie można opisać działanie w osobnym akapicie i tam rozróżnić użycie z Lombok i bez.

Możemy wyróżnić kilka sposobów wstrzykiwania zależności, z których każdy ma swoje zalety i ograniczenia.
Poniżej przedstawiam najpopularniejsze techniki DI:

- Wstrzykiwanie przez konstruktor z jawnie zdefiniowanym konstruktorem
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stylistyka: "Wstrzykiwanie jawnie zdefiniowanym konstruktorem"

- Wstrzykiwanie przez konstruktor z jawnie zdefiniowanym konstruktorem
```java
@Component
public class ServiceA {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

luźna sugestia. ServiceA, ServiceB nic nie znaczą, dlatego zawsze namiawiam, żeby w przykładach używać realistycznych nazw - taki kod jest wtedy bardziej czytelny.
Na przykład OrderService do którego wstrzykujemy PaymentService.

---

Czy wiesz, że sposób wstrzykiwania zależności w Springu może mieć ogromny wpływ na jakość Twojego kodu, jego bezpieczeństwo i łatwość testowania?
Jeśli chcesz pisać lepsze aplikacje, warto poznać najważniejsze techniki i wybrać tę, która naprawdę robi różnicę.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tę, która przynosi najlepsze efekty?
ewentualnie jakaś konkretna korzyść, np.:

  • tę, która zagwarantuje Twojej aplikacji najwyższą odporność na błędy.
  • która maksymalnie uprości późniejszy rozwój i utrzymanie Twojego systemu.
  • która znacznie skróci czas pisania testów jednostkowych i poprawi czytelność architektury.

private ServiceB serviceB;
}
```
*Wstrzykiwanie przez pola jest najmniej zalecane, ponieważ utrudnia testowanie i nie pozwala na oznaczenie zależności jako finalne.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jest najmniej zalecanym podejściem, ponieważ


- **Wymuszenie przekazania zależności podczas tworzenia obiektu** – wstrzykiwanie przez konstruktor gwarantuje,
że wszystkie wymagane zależności zostaną dostarczone w momencie tworzenia instancji obiektu. Dzięki temu unikamy sytuacji,
w której klasa może być używana bez pełnych zależności, co mogłoby prowadzić do błędów w czasie działania.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tutaj zmieniłbym na runtime (jeśli to o to chodziło), albo

Dzięki temu unikamy sytuacji, w której klasa może być używana bez pełnych zależności, zapobiegając tym samym nieprzewidzianym awariom już po uruchomieniu aplikacji.

- **Niezmienność obiektu** – przypisanie zależności poprzez konstruktor oznacza, że pola te mogą być oznaczone jako `final`,
co zapewnia ich niezmienność i chroni przed niepożądanymi modyfikacjami w trakcie cyklu życia obiektu. Taka konstrukcja promuje czystszy i bardziej bezpieczny kod.
- **Testy jednostkowe** – wstrzykiwanie przez konstruktor ułatwia testowanie,
ponieważ możemy ręcznie dostarczać zależności (np. mocki) bez potrzeby używania narzędzi wspomagających, jak refleksja.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

takich narzędzi wspomagających, jak refleksja.

co zapewnia ich niezmienność i chroni przed niepożądanymi modyfikacjami w trakcie cyklu życia obiektu. Taka konstrukcja promuje czystszy i bardziej bezpieczny kod.
- **Testy jednostkowe** – wstrzykiwanie przez konstruktor ułatwia testowanie,
ponieważ możemy ręcznie dostarczać zależności (np. mocki) bez potrzeby używania narzędzi wspomagających, jak refleksja.
To pozwala na łatwiejsze pisanie testów jednostkowych i zachowanie pełnej kontroli nad zależnościami podczas testowania.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To ułatwia pisanie testów jednostkowych i pozwala na zachowanie pełnej kontroli nad zależnościami podczas testowania.

W przypadku wstrzykiwania przez konstruktor łatwiej jest zidentyfikować brakujące zależności lub problemy z ich konfiguracją podczas uruchamiania aplikacji,
ponieważ Spring od razu poinformuje nas o braku zależności, której nie można dostarczyć.

Konstruktor pozwala lepiej unikać problemów z cyklicznymi zależnościami, które mogą występować w innych formach wstrzykiwania (np. wstrzykiwanie przez pola).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Konstruktor pomaga w szybszym wykrywaniu problemów z cyklicznymi zależnościami(...)


Wstrzykiwanie zależności przez konstruktor to najlepsza praktyka w aplikacjach Spring.
Zapewnia bezpieczeństwo, czytelność kodu, łatwość testowania i zgodność z zasadami SOLID.
Warto stosować to podejście zawsze, gdy to możliwe, a inne metody rezerwować dla szczególnych przypadków (opcjonalne zależności, legacy code).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jest ok, ale może akurat:

Warto przyjąć to podejście jako domyślny standard w każdym projekcie, a inne metody (...)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants