Bean-scope ohjaa sitä, kuinka monta instanssia container luo ja kuinka kauan ne elävät. Elinkaari-callbackit antavat ajaa koodia heti beanin rakentamisen jälkeen ja juuri ennen sen tuhoamista.
Bean-scope ohjaa sitä, kuinka monta instanssia container luo ja kuinka kauan ne elävät. Elinkaari-callbackit antavat ajaa koodia heti beanin rakentamisen jälkeen ja juuri ennen sen tuhoamista.
@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 { }
Klassinen ansa: prototypen injektoiminen singletoniin. Singleton kytketään kerran, joten se pitää yhtä prototype-instanssia ikuisesti — "uusi joka kerta" -lupaus rikkoutuu. Korjaa se @Lookupilla, ObjectProvider<ReportBuilder>illa tai scoped-proxylla.
@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 */ }
}
Tärkeää: Spring ei kutsu @PreDestroya prototype-beaneille — se luovuttaa ne ja lakkaa seuraamasta niitä, joten sinä omistat niiden siivouksen.
Tämä erottaa ne, jotka kohtelevat Springiä taikuutena, niistä, jotka ymmärtävät containerin. Singletonin-pitämä-prototype-bugi on suosikkihaastatteluskenaario, koska se on hienovarainen ja aiheuttaa todellisia tuotantobugeja. Se, että tiedät singletonien olevan tilattomia ja säikeenturvallisia (ne jaetaan kaikkien pyyntösäikeiden kesken), on käytännön oivallus, jota haastattelijat kuuntelevat.
Kirjasto IT-haastattelukysymyksiä yksityiskohtaisine vastauksineen — Juniorista Senioriin.
Lahjoita