Scope beanu řídí, kolik instancí kontejner vytvoří a jak dlouho žijí. Lifecycle callbacky umožňují spustit kód hned po zkonstruování beanu a těsně před jeho zničením.
Scope beanu řídí, kolik instancí kontejner vytvoří a jak dlouho žijí. Lifecycle callbacky umožňují spustit kód hned po zkonstruování beanu a těsně před jeho zničením.
@Service // ve výchozím stavu singleton — jeden sdílený OrderService pro celou aplikaci
public class OrderService { }
@Component
@Scope("prototype") // čerstvá instance při každém getBean/inject
public class ReportBuilder { }
Klasická past: injektování prototypu do singletonu. Singleton je propojen jednou, takže si navždy drží jedinou instanci prototypu — slib „nová pokaždé“ se poruší. Opravte to pomocí @Lookup, ObjectProvider<ReportBuilder> nebo scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // spustí se po injektování závislostí, před použitím
public void open() { /* otevři sockety, nahřej cache */ }
@PreDestroy // spustí se při korektním vypnutí kontejneru (jen singletony)
public void close() { /* uvolni zdroje */ }
}
Důležité: Spring nevolá @PreDestroy na prototypových beanech — předá je a přestane je sledovat, takže jejich úklid vlastníte vy.
Tohle odděluje ty, kdo Spring berou jako magii, od těch, kdo kontejneru rozumí. Bug se singletonem držícím prototyp je oblíbený scénář u pohovoru, protože je záludný a způsobuje reálné produkční bugy. Vědomí, že singletony musí být bezstavové a thread-safe (jsou sdílené napříč všemi vlákny požadavků), je praktické ponaučení, na které tazatelé slyší.
Knihovna IT otázek k pohovoru s podrobnými odpověďmi — od Junior po Senior.
Přispět