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.

Spring

Baza pytań rekrutacyjnych i wiedzy. Filtruj, szukaj i sprawdzaj swoją wiedzę.

Tematy

Co to jest wstrzykiwanie zależności?

easydiinversion-of-controlspring+1
Otwórz pytanie

Odpowiedź

Dependency Injection polega na tym, że obiekt dostaje swoje zależności z zewnątrz (zwykle przez konstruktor), zamiast tworzyć je sam przez new. W Springu kontener IoC tworzy beany, wstrzykuje zależności i zarządza cyklem życia, zmniejszając coupling i ułatwiając testowanie.

@Component vs @Bean?

mediumannotationconfigurationbean+1
Otwórz pytanie

Odpowiedź

@Component oznacza klasę wykrywaną przez component scanning i automatycznie rejestrowaną jako bean. @Bean stosuje się na metodzie w klasie @Configuration, aby obiekt zwrócony przez metodę stał się beanem — zwykle dla typów z bibliotek zewnętrznych lub niestandardowej inicjalizacji. W obu przypadkach powstaje zarządzany bean Springa.

Co to są Spring Boot Starters?

easyspring-bootdependencyconfiguration
Otwórz pytanie

Odpowiedź

Startery to przygotowane zestawy zależności, które dodają typowe biblioteki (z kompatybilnymi wersjami) dla danej funkcji. Np. spring-boot-starter-web dociąga Spring MVC, Jackson i wbudowany serwer. Ułatwiają start i współpracują z auto‑konfiguracją.

Jakie są zakresy (scopes) Beanów?

mediumbeanscopelifecycle+1
Otwórz pytanie

Odpowiedź

Zakres beana (scope) określa jego cykl życia i zasięg. Domyślnie jest singleton (jedna instancja w kontenerze). Prototype tworzy nową instancję przy każdym wstrzyknięciu. W aplikacjach webowych są też scope’y request, session i application.

Jak działa @Transactional?

hardtransactionaopdatabase+1
Otwórz pytanie

Odpowiedź

@Transactional działa przez proxy/AOP Springa: przed wejściem do metody otwierana jest transakcja, a po wyjściu następuje commit lub rollback zgodnie z wyjątkami i regułami. Można ustawić propagację i izolację; wywołanie metody z tej samej klasy omija proxy.

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

easydiiocconstructor-injection
Otwórz pytanie

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.

`@Component` vs `@Service` vs `@Repository` — czym się różnią?

easycomponentservicerepository
Otwórz pytanie

Odpowiedź

Wszystkie to „stereotypy” do component scan; różnica to głównie intencja. `@Service` oznacza logikę biznesową, `@Repository` warstwę dostępu do danych i może tłumaczyć wyjątki persystencji, a `@Component` jest ogólne.

`@RestController` vs `@Controller` — co się zmienia?

easyrestcontrollercontrollerspring-mvc
Otwórz pytanie

Odpowiedź

`@RestController` to w praktyce `@Controller` + `@ResponseBody`, więc metody zwracają bezpośrednio body odpowiedzi (często JSON). `@Controller` zwykle służy do widoków/template’ów renderowanych po stronie serwera.

Bean scope w Springu — co znaczy `singleton` vs `prototype`?

mediumbeanscopesingleton+1
Otwórz pytanie

Odpowiedź

`singleton` (domyślnie) oznacza jedną instancję beana na kontener Springa. `prototype` oznacza nową instancję przy każdym pobraniu; w aplikacjach web są też scope request/session.

Jak działa `@Transactional` (rollback + typowa pułapka)?

mediumtransactiontransactionalrollback
Otwórz pytanie

Odpowiedź

Uruchamia metodę w transakcji; domyślnie Spring robi rollback na unchecked (`RuntimeException`). Typowa pułapka to self-invocation: wywołanie `@Transactional` z tej samej klasy omija proxy, więc transakcja może się nie uruchomić.

Co to jest auto-konfiguracja Spring Boot (i czym są startery)?

mediumspring-bootauto-configurationstarter
Otwórz pytanie

Odpowiedź

Boot auto-konfiguruje beany na podstawie zależności na classpath i properties (daje sensowne defaulty). Startery to paczki zależności (np. `spring-boot-starter-web`), które dobierają biblioteki i uruchamiają powiązaną auto-konfigurację.

Proxy w Spring AOP — na czym polega problem self-invocation?

hardaopproxytransactional
Otwórz pytanie

Odpowiedź

Spring AOP zwykle działa przez proxy wokół beana. Gdy metoda w tej samej klasie wywoła inną „aspektowaną” metodę bezpośrednio (`this.someMethod()`), omija proxy, więc np. `@Transactional` może się nie zadziałać.

Jak globalnie obsłużyć wyjątki w Spring MVC?

hardcontrolleradviceexceptionhandlererror-handling
Otwórz pytanie

Odpowiedź

Użyj `@ControllerAdvice` z `@ExceptionHandler`, aby mapować wyjątki na spójne odpowiedzi HTTP (status + body). Dzięki temu kontrolery są czystsze, a obsługa błędów jest w jednym miejscu.

Spring Security — gdzie dzieje się uwierzytelnianie/autoryzacja?

hardspring-securityfiltersauth
Otwórz pytanie

Odpowiedź

Głównie w łańcuchu filtrów bezpieczeństwa, zanim request trafi do kontrolera. Filtry budują `SecurityContext` (authentication), a potem reguły autoryzacji decydują o dostępie (URL, method security itd.).

`@WebMvcTest` vs `@SpringBootTest` — kiedy czego użyć?

hardtestingwebmvctestspringboottest
Otwórz pytanie

Odpowiedź

`@WebMvcTest` to test typu slice: ładuje warstwę MVC (kontrolery itd.) i jest szybki, zwykle z mockami zależności. `@SpringBootTest` ładuje cały kontekst aplikacji i nadaje się do integracji, ale jest wolniejszy.

Co robią `@Configuration` i `@Bean` w Springu?

easyconfigurationbeanspring-core
Otwórz pytanie

Odpowiedź

`@Configuration` oznacza klasę, w której definiujesz beany Springa. `@Bean` oznacza metodę, której wynik ma być zarządzany przez Spring jako bean (tworzenie, wstrzykiwanie, lifecycle).

`@RequestParam` vs `@PathVariable` — kiedy czego użyć?

mediumspring-mvcrequestparampathvariable+1
Otwórz pytanie

Odpowiedź

`@PathVariable` używaj do identyfikatorów będących częścią ścieżki zasobu (np. `/users/{id}`). `@RequestParam` jest dla opcjonalnych filtrów, paginacji i parametrów zapytania (np. `?page=2&sort=name`).

Co robi `@Valid` w Springu i gdzie uruchamia się walidacja?

mediumvalidationbean-validationjakarta+1
Otwórz pytanie

Odpowiedź

`@Valid` uruchamia Bean Validation (Jakarta Validation) na podstawie adnotacji typu `@NotNull`, `@Size` dla body/parametrów. Walidacja działa po stronie serwera, zanim kontroler przetworzy obiekt; błędy zwykle kończą się 400 (często przez exception handler).

Spring Data JPA: co to jest problem N+1 i jak go ograniczać?

hardjpahibernaten-plus-one+1
Otwórz pytanie

Odpowiedź

N+1 to sytuacja, gdy pobierasz N encji nadrzędnych, a potem leci po jednym dodatkowym zapytaniu na każdą (lazy loading). Ograniczasz przez fetch join, `@EntityGraph`, batching albo lepsze zapytania, żeby zmniejszyć liczbę round-tripów.

Propagation w transakcjach Spring — co oznacza `REQUIRED`?

hardtransactionpropagationspring+1
Otwórz pytanie

Odpowiedź

`REQUIRED` oznacza: dołącz do istniejącej transakcji, jeśli jest; w przeciwnym razie rozpocznij nową. To domyślne ustawienie, bo dobrze się składa w typowych wywołaniach serwis→serwis.

Co robi `@Profile` w Springu?

easyprofilesconfigurationspring
Otwórz pytanie

Odpowiedź

`@Profile` warunkowo włącza beany w zależności od aktywnego profilu (np. `dev`, `test`, `prod`). Pozwala podmieniać implementacje/konfigurację per środowisko bez zmiany kodu.

`@Scheduled` w klastrze — co może pójść źle i jak tego uniknąć?

mediumscheduledclusterdistributed-lock+1
Otwórz pytanie

Odpowiedź

Gdy masz wiele instancji, każda uruchomi ten sam job i powstaną duplikaty. Unikasz tego przez leader election, distributed lock (ostrożnie), jedną dedykowaną instancję schedulera albo przeniesienie schedulowania do systemu zewnętrznego.

Paginacja w Spring Data: czym są `Page` i `Slice` i kiedy czego użyć?

mediumspring-datapaginationpage+1
Otwórz pytanie

Odpowiedź

`Page` zawiera total count i liczbę stron (wymaga dodatkowego zapytania count). `Slice` wie tylko, czy jest następna strona (bez total count), więc jest tańszy. Użyj `Slice`, gdy nie potrzebujesz sum i chcesz lepszej wydajności.

Jak działa `@Async` w Springu i jaka jest typowa pułapka?

hardasyncexecutorproxy+1
Otwórz pytanie

Odpowiedź

Spring uruchamia metodę na osobnym executorze przez proxy. Typowa pułapka to self-invocation (wywołanie z tej samej klasy), które omija proxy, więc metoda nie poleci async. Ważne jest też odpowiednie ustawienie executora.

SecurityContext w Spring Security — czemu auth może się „zgubić” w async kodzie?

hardspring-securitysecuritycontextthreadlocal+1
Otwórz pytanie

Odpowiedź

SecurityContext jest często trzymany w ThreadLocal. Gdy zmieniasz wątek (async/executor), nowy wątek może nie mieć tego kontekstu i znika info o użytkowniku. Trzeba propagować kontekst albo użyć wspieranej integracji bezpieczeństwa dla async.

Czym jest Spring `ApplicationContext` (w jednym zdaniu)?

easyspringiocapplicationcontext+1
Otwórz pytanie

Odpowiedź

`ApplicationContext` to kontener IoC Springa: tworzy, łączy i zarządza beanami (wraz z ich cyklem życia) oraz pozwala je wyszukiwać po typie/nazwie.

Dlaczego warto użyć `@ConfigurationProperties` zamiast wielu `@Value`?

mediumspring-bootconfigurationproperties+1
Otwórz pytanie

Odpowiedź

`@ConfigurationProperties` bindowuje grupę wartości konfiguracyjnych do typowanej klasy, więc łatwiej to walidować, refaktorować i testować. Utrzymuje konfigurację w strukturze (jeden prefix) i nie rozrzuca stringowych kluczy po całym kodzie.

Cykl życia beana: kiedy wykonują się `@PostConstruct` i `@PreDestroy`?

mediumspringbeanslifecycle+2
Otwórz pytanie

Odpowiedź

`@PostConstruct` uruchamia się po utworzeniu beana i wstrzyknięciu zależności. `@PreDestroy` uruchamia się przy zamykaniu kontekstu aplikacji (dla beanów, którymi zarządza, zwykle singletonów). Częsty gotcha: Spring nie wywołuje automatycznie destruktorów dla beanów w scope `prototype`.

Co to jest `BeanPostProcessor` i kiedy byś go użył?

hardspringbeanpostprocessoraop+1
Otwórz pytanie

Odpowiedź

`BeanPostProcessor` to hook, który może modyfikować lub owijać beany przed/po inicjalizacji. Spring używa go m.in. do AOP proxy, `@Async` i `@Transactional`. Przydaje się do zachowań przekrojowych, ale to “mocna broń”, którą łatwo nadużyć.

Spring MVC vs WebFlux - jaka jest realna różnica i kiedy WebFlux pomaga?

hardspringmvcwebflux+1
Otwórz pytanie

Odpowiedź

Spring MVC jest oparte o servlet i zwykle używa wątku na request; jest świetne dla większości CRUD i dobrze współpracuje z blokującymi bibliotekami. WebFlux jest reaktywne i non-blocking, co pomaga przy dużej współbieżności i streamingu — ale tylko jeśli cały stack jest non-blocking. WebFlux z blokującymi wywołaniami często zabiera korzyści.

Spring MVC `@RequestBody`: co robi i jaki jest częsty problem?

easyspringmvcrequestbody+1
Otwórz pytanie

Odpowiedź

`@RequestBody` mapuje body requestu (zwykle JSON) na obiekt przez `HttpMessageConverter` (często Jackson). Częsty problem to brak lub zły `Content-Type: application/json`, co może skończyć się błędami 415/400. Możesz połączyć z `@Valid`, żeby walidować input.

Spring Boot Actuator: co to jest i czemu trzeba to zabezpieczyć?

mediumspring-bootactuatorobservability+1
Otwórz pytanie

Odpowiedź

Actuator dodaje endpointy operacyjne jak health checki, metryki i info (np. `/actuator/health`, `/actuator/metrics`). Pomaga w monitoringu i debugowaniu, ale może ujawniać wrażliwe dane (env, konfigurację, szczegóły systemu), więc trzeba ograniczyć dostęp i wystawiać tylko to, co potrzebne.

Priorytet konfiguracji w Spring Boot: które źródła zwykle nadpisują które?

mediumspring-bootconfigurationprofiles+1
Otwórz pytanie

Odpowiedź

Na wysokim poziomie: bardziej “specyficzne” źródła nadpisują defaulty. Argumenty z linii poleceń i zmienne środowiskowe zwykle nadpisują `application.yml`, a konfiguracja profilu (np. `application-prod.yml`) nadpisuje bazową, gdy profil jest aktywny. Spring składa wartości z wielu źródeł i wygrywa to o wyższym priorytecie.

`@Cacheable`: jak działa cache w Springu i podaj dwie pułapki?

hardspringcachecacheable+1
Otwórz pytanie

Odpowiedź

`@Cacheable` zapisuje wynik wywołania metody pod kluczem (zwykle z argumentów). Jest realizowane przez proxy/AOP. Typowe pułapki: self-invocation omija proxy (cache nie zadziała) oraz ryzyko “starych” danych, jeśli nie robisz invalidacji (`@CacheEvict`) lub TTL po stronie dostawcy cache.

`@Transactional` isolation i `readOnly`: co to naprawdę oznacza?

hardspringtransactionsisolation+1
Otwórz pytanie

Odpowiedź

`isolation` mapuje się na poziom izolacji w bazie (jak współbieżne odczyty/zapisy na siebie wpływają). `readOnly = true` to zwykle hint dla frameworka/drivera do optymalizacji, ale nie zawsze blokuje zapisy “z automatu”. I pamiętaj: `@Transactional` działa przez proxy, więc nie zadziała przy self-invocation.

Auto‑konfiguracja Spring Boot: jak działa na wysokim poziomie?

mediumspring-bootauto-configurationstarters+1
Otwórz pytanie

Odpowiedź

Spring Boot używa `@EnableAutoConfiguration` oraz adnotacji warunkowych, aby konfigurować beany na podstawie classpath i właściwości (np. `@ConditionalOnClass`, `@ConditionalOnProperty`). Startery dostarczają zależności, a auto‑config tworzy rozsądne domyślne beany, które możesz nadpisać.

`@ConfigurationProperties` vs `@Value`: kiedy lepiej użyć `@ConfigurationProperties`?

mediumspring-bootconfigurationproperties+1
Otwórz pytanie

Odpowiedź

`@ConfigurationProperties` jest lepsze do wiązania grup powiązanych ustawień w jeden obiekt — wspiera zagnieżdżenia i walidację oraz trzyma konfigurację spójnie. `@Value` nadaje się do pojedynczych wartości, ale gorzej sprawdza się przy większych konfiguracjach.

Co robi `@Profile` w Springu i kiedy się go używa?

easyspringprofilesconfiguration+1
Otwórz pytanie

Odpowiedź

`@Profile` włącza lub wyłącza beany zależnie od aktywnego profilu (np. `dev`, `test`, `prod`). Używaj go do konfiguracji specyficznych dla środowiska: mocków, innych data source, itp.

`@Qualifier` vs `@Primary`: jak rozstrzygają wiele beanów?

mediumspringdiqualifier+1
Otwórz pytanie

Odpowiedź

`@Primary` wskazuje domyślny bean, gdy jest wiele kandydatów. `@Qualifier` pozwala wybrać konkretny bean po nazwie/kwalifikatorze w miejscu wstrzyknięcia. Możesz je łączyć: `@Primary` jako domyślne i `@Qualifier` tam, gdzie chcesz nadpisać.

`@RestController` vs `@Controller`: jaka jest różnica?

easyspringmvccontroller+1
Otwórz pytanie

Odpowiedź

`@RestController` to `@Controller` + `@ResponseBody`, więc wartości zwracane są zapisywane w odpowiedzi HTTP (zwykle JSON). `@Controller` służy do widoków MVC i zwykle zwraca nazwę widoku, chyba że dodasz `@ResponseBody`.

Lifecycle beanów: co robią `@PostConstruct` i `@PreDestroy`?

mediumspringlifecyclepostconstruct+1
Otwórz pytanie

Odpowiedź

`@PostConstruct` uruchamia się po wstrzyknięciu zależności, aby wykonać inicjalizację (np. walidacja konfiguracji, rozgrzanie cache). `@PreDestroy` działa przy zamykaniu kontekstu, aby zwolnić zasoby. To hooki lifecycle zarządzane przez kontener.

Metody `@Async`: jak działają i jakie są typowe pułapki?

hardspringasyncexecutor+1
Otwórz pytanie

Odpowiedź

`@Async` uruchamia metodę w osobnym wątku przez proxy Springa i `Executor`. Typowe pułapki: nie działa przy self‑invocation, wymaga publicznej metody na beanie Springa i blokujące I/O może zajechać pulę wątków, jeśli nie jest dobrze ustawiona.

`@Scheduled`: fixedRate vs fixedDelay vs cron — jaka jest różnica?

mediumspringschedulingcron+1
Otwórz pytanie

Odpowiedź

fixedRate planuje kolejne uruchomienie względem startu poprzedniego (może się nakładać, jeśli zadanie trwa długo). fixedDelay planuje względem zakończenia poprzedniego (bez nakładania). cron używa wyrażeń cron do harmonogramów kalendarzowych.

WebClient vs RestTemplate: którego użyć i dlaczego?

mediumspringwebclientresttemplate+1
Otwórz pytanie

Odpowiedź

WebClient to nowszy, nieblokujący klient reaktywny (dobry do WebFlux i async IO). RestTemplate jest blokujący i jest w trybie maintenance. W nowym kodzie zwykle preferuj WebClient, chyba że świadomie chcesz zachowania blokującego.

BeanFactory vs ApplicationContext: jaka jest praktyczna różnica?

mediumspringiocapplicationcontext+1
Otwórz pytanie

Odpowiedź

BeanFactory to minimalny kontener IoC (domyślnie lazy). ApplicationContext rozszerza go o funkcje typu i18n, eventy i eager inicjalizację singletonów. W praktyce zwykle używa się ApplicationContext.