Zakres beana kontroluje, ile instancji tworzy kontener i jak długo one żyją. Callbacki cyklu życia pozwalają uruchomić kod tuż po skonstruowaniu beana oraz tuż przed jego zniszczeniem.
Zakres beana kontroluje, ile instancji tworzy kontener i jak długo one żyją. Callbacki cyklu życia pozwalają uruchomić kod tuż po skonstruowaniu beana oraz tuż przed jego zniszczeniem.
@Service // singleton by default — one shared OrderService for the whole app
public class OrderService { }
@Component
@Scope("prototype") // fresh instance on every getBean/inject
public class ReportBuilder { }
Klasyczna pułapka: wstrzyknięcie prototypu do singletona. Singleton jest łączony raz, więc na zawsze zachowuje pojedynczą instancję prototypu — obietnica „nowy za każdym razem” się łamie. Napraw to przez @Lookup, ObjectProvider<ReportBuilder> lub scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // runs after dependencies are injected, before use
public void open() { /* open sockets, warm caches */ }
@PreDestroy // runs on graceful container shutdown (singletons only)
public void close() { /* release resources */ }
}
Ważne: Spring nie wywołuje @PreDestroy na beanach prototype — oddaje je i przestaje je śledzić, więc ty odpowiadasz za ich sprzątanie.
To oddziela osoby, które traktują Springa jak magię, od tych, które rozumieją kontener. Błąd singletona trzymającego prototyp to ulubiony scenariusz rozmów, bo jest subtelny i powoduje realne błędy produkcyjne. Wiedza, że singletony muszą być bezstanowe i thread-safe (są współdzielone przez wszystkie wątki żądań), to praktyczny wniosek, którego rekruterzy nasłuchują.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj