Skip to content

Commit 0e4b2f5

Browse files
committed
[2026-02-13] poprawki
1 parent da277c0 commit 0e4b2f5

2 files changed

Lines changed: 80 additions & 37 deletions

File tree

_posts/pl/2026-03-06-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor.md renamed to _posts/pl/2026-03-12-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor.md

Lines changed: 80 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
---
22
layout: post
33
title: "Czy wiesz, że zależności w Springu powinniśmy wstrzykiwać przez konstruktor?"
4-
date: 2026-02-12T08:00:00+01:00
4+
date: 2026-03-12T08:00:00+01:00
55
published: true
66
didyouknow: false
77
lang: pl
88
author: bpietrowiak
9-
image: /assets/img/posts/2026-03-06-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor/thumbnail.webp
9+
image: /assets/img/posts/2026-03-12-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor/thumbnail.webp
1010
description: "Poznaj zalety tego podejścia, przykłady kodu i wskazówki dotyczące testowania oraz bezpieczeństwa aplikacji."
1111
tags:
1212
- spring boot
1313
- java
1414
---
1515

1616
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?
17-
Jeśli chcesz pisać lepsze aplikacje, warto poznać najważniejsze techniki i wybrać tę, która naprawdę robi różnicę.
17+
Jeśli chcesz pisać lepsze aplikacje, warto poznać najważniejsze techniki i wybrać tę, która przynosi najlepsze efekty.
1818

1919
## Czym jest wstrzykiwanie zależności?
2020

@@ -28,14 +28,14 @@ w którym zarządzanie tworzeniem obiektów i ich zależnościami przekazywane j
2828
Możemy wyróżnić kilka sposobów wstrzykiwania zależności, z których każdy ma swoje zalety i ograniczenia.
2929
Poniżej przedstawiam najpopularniejsze techniki DI:
3030

31-
- Wstrzykiwanie przez konstruktor z jawnie zdefiniowanym konstruktorem
31+
- Wstrzykiwanie jawnie zdefiniowanym konstruktorem
3232
```java
3333
@Component
34-
public class ServiceA {
35-
private final ServiceB serviceB;
34+
public class OrderService {
35+
private final PaymentService paymentService;
3636

37-
public ServiceA(final ServiceB serviceB) {
38-
this.serviceB = serviceB;
37+
public OrderService(final PaymentService paymentService) {
38+
this.paymentService = paymentService;
3939
}
4040
}
4141
```
@@ -44,68 +44,111 @@ public class ServiceA {
4444
```java
4545
@Component
4646
@RequiredArgsConstructor
47-
public class ServiceA {
48-
private final ServiceB serviceB;
47+
public class OrderService {
48+
private final PaymentService paymentService;
4949
}
5050
```
5151
*Adnotacja `@RequiredArgsConstructor` pochodzi z biblioteki Lombok i automatycznie generuje konstruktor przyjmujący wszystkie pola oznaczone jako `final`
5252
lub z adnotacją `@NonNull`.*
53+
- Wstrzykiwanie przez pola
54+
```java
55+
@Component
56+
public class OrderService {
57+
@Autowired
58+
private PaymentService paymentService;
59+
}
60+
```
61+
*Wstrzykiwanie przez pola jest najmniej zalecanym podejściem, ponieważ utrudnia testowanie i nie pozwala na oznaczenie zależności jako finalne.
62+
Może być stosowane w wyjątkowych przypadkach, np. w bardzo prostych klasach lub kodzie legacy.*
63+
64+
65+
### @Qualifier - kiedy i jak używać?
66+
67+
Adnotacja `@Qualifier` służy do wskazania konkretnego beana, gdy w kontekście Springa istnieje wiele beanów tego samego typu.
68+
Technicznie działa w każdym stylu wstrzykiwania, ale podejścia różnią się czytelnością i łatwością testowania.
69+
70+
Najbardziej czytelnie: `@Qualifier` w konstruktorze
71+
```java
72+
@Component
73+
public class OrderService {
74+
private final PaymentService paymentService;
75+
76+
public OrderService(@Qualifier("paymentService") PaymentService paymentService) {
77+
this.paymentService = paymentService;
78+
}
79+
}
80+
```
81+
82+
Gdy zależność jest opcjonalna: `@Qualifier` w setterze
83+
```java
84+
@Component
85+
public class OrderService {
86+
private PaymentService paymentService;
87+
88+
@Autowired
89+
public void setPaymentService(
90+
@Qualifier("paymentService") PaymentService paymentService) {
91+
this.paymentService = paymentService;
92+
}
93+
}
94+
```
95+
96+
Najmniej zalecane: `@Qualifier` na polu
97+
```java
98+
@Component
99+
public class OrderService {
100+
@Autowired
101+
@Qualifier("paymentService")
102+
private PaymentService paymentService;
103+
}
104+
```
105+
106+
Jeśli używasz Lombok (`@RequiredArgsConstructor`), możesz pozostać przy stylu konstruktorowym i jednocześnie oznaczyć pole adnotacją `@Qualifier`:
53107

54-
- Wstrzykiwanie przez konstruktor z wykorzystaniem adnotacji `@RequiredArgsConstructor` oraz `@Qualifier`
55108
```java
56109
@Component
57110
@RequiredArgsConstructor
58-
public class ServiceA {
59-
@Qualifier("serviceB")
60-
private final ServiceB serviceB;
111+
public class OrderService {
112+
@Qualifier("paymentService")
113+
private final PaymentService paymentService;
61114
}
62115
```
63-
*Adnotacja `@Qualifier` jest przydatna, gdy w kontekście Springa istnieje wiele beanów tego samego typu i chcemy wskazać,
64-
który z nich ma zostać wstrzyknięty.*
65116

66-
W pliku `lombok.config` należy dodać wpis:
117+
W takim wariancie dodaj w pliku `lombok.config`:
67118

68119
```
69120
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
70121
```
71122

123+
Dzięki temu Lombok przeniesie `@Qualifier` z pola do parametru wygenerowanego konstruktora.
124+
72125
- Wstrzykiwanie przez settery (metody ustawiające)
73126
```java
74127
@Component
75-
public class ServiceA {
76-
private ServiceB serviceB;
128+
public class OrderService {
129+
private PaymentService paymentService;
77130

78131
@Autowired
79-
public void setServiceB(ServiceB serviceB) {
80-
this.serviceB = serviceB;
132+
public void setPaymentService(PaymentService paymentService) {
133+
this.paymentService = paymentService;
81134
}
82135
}
83136
```
84137
*Wstrzykiwanie przez settery może być uzasadnione, gdy zależność jest opcjonalna lub gdy pracujemy z kodem legacy, gdzie nie możemy zmienić konstruktora.*
85138

86-
- Wstrzykiwanie przez pola
87-
```java
88-
@Component
89-
public class ServiceA {
90-
@Autowired
91-
private ServiceB serviceB;
92-
}
93-
```
94-
*Wstrzykiwanie przez pola jest najmniej zalecane, ponieważ utrudnia testowanie i nie pozwala na oznaczenie zależności jako finalne.
95-
Może być stosowane w wyjątkowych przypadkach, np. w bardzo prostych klasach lub kodzie legacy.*
96139

97140
## Którą metodę powinniśmy wykorzystywać i dlaczego?
98141

99142
Rekomendowanym podejściem jest wykorzystywanie wstrzykiwania przez konstruktor. Oto powody, dla których to podejście jest preferowane:
100143

101144
- **Wymuszenie przekazania zależności podczas tworzenia obiektu** – wstrzykiwanie przez konstruktor gwarantuje,
102145
że wszystkie wymagane zależności zostaną dostarczone w momencie tworzenia instancji obiektu. Dzięki temu unikamy sytuacji,
103-
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.
146+
w której klasa może być używana bez pełnych zależności, co mogłoby prowadzić do błędów w runtime.
104147
- **Niezmienność obiektu** – przypisanie zależności poprzez konstruktor oznacza, że pola te mogą być oznaczone jako `final`,
105148
co zapewnia ich niezmienność i chroni przed niepożądanymi modyfikacjami w trakcie cyklu życia obiektu. Taka konstrukcja promuje czystszy i bardziej bezpieczny kod.
106149
- **Testy jednostkowe** – wstrzykiwanie przez konstruktor ułatwia testowanie,
107-
ponieważ możemy ręcznie dostarczać zależności (np. mocki) bez potrzeby używania narzędzi wspomagających, jak refleksja.
108-
To pozwala na łatwiejsze pisanie testów jednostkowych i zachowanie pełnej kontroli nad zależnościami podczas testowania.
150+
ponieważ możemy ręcznie dostarczać zależności (np. mocki) bez potrzeby używania takich narzędzi wspomagających, jak refleksja.
151+
To ułatwia pisanie testów jednostkowych i pozwala na zachowanie pełnej kontroli nad zależnościami podczas testowania.
109152

110153

111154
Wstrzykiwanie przez konstruktor wspiera zasady **SOLID**, w szczególności:
@@ -121,12 +164,12 @@ Programista, przeglądając kod, natychmiast widzi, jakie komponenty są wymagan
121164
W przypadku wstrzykiwania przez konstruktor łatwiej jest zidentyfikować brakujące zależności lub problemy z ich konfiguracją podczas uruchamiania aplikacji,
122165
ponieważ Spring od razu poinformuje nas o braku zależności, której nie można dostarczyć.
123166

124-
Konstruktor pozwala lepiej unikać problemów z cyklicznymi zależnościami, które mogą występować w innych formach wstrzykiwania (np. wstrzykiwanie przez pola).
167+
Konstruktor pomaga w szybszym wykrywaniu problemów z cyklicznymi zależnościami, które mogą występować w innych formach wstrzykiwania (np. wstrzykiwanie przez pola).
125168
Spring będzie w stanie zidentyfikować takie sytuacje już na etapie konfigurowania obiektów, co ułatwia ich eliminację.
126169

127170
## Podsumowanie
128171

129172
Wstrzykiwanie zależności przez konstruktor to najlepsza praktyka w aplikacjach Spring.
130-
Zapewnia bezpieczeństwo, czytelność kodu, łatwość testowania i zgodność z zasadami SOLID.
131-
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).
173+
Zapewnia bezpieczeństwo, czytelność kodu, łatwość testowania i zgodność z zasadami SOLID.
174+
Warto przyjąć to podejście jako domyślny standard w każdym projekcie, a inne metody rezerwować dla szczególnych przypadków (opcjonalne zależności, legacy code).
132175
Dzięki temu Twój kod będzie bardziej niezawodny i łatwiejszy w utrzymaniu.

assets/img/posts/2026-03-06-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor/thumbnail.webp renamed to assets/img/posts/2026-03-12-czy-wiesz-ze-zaleznosci-w-springu-powinnismy-wstrzykiwac-przez-konstruktor/thumbnail.webp

File renamed without changes.

0 commit comments

Comments
 (0)