Beano scope valdo, kiek instancijų konteineris sukuria ir kiek ilgai jos gyvuoja. Gyvavimo ciklo callback'ai leidžia vykdyti kodą iškart po beano sukūrimo ir prieš pat jo sunaikinimą.
Beano scope valdo, kiek instancijų konteineris sukuria ir kiek ilgai jos gyvuoja. Gyvavimo ciklo callback'ai leidžia vykdyti kodą iškart po beano sukūrimo ir prieš pat jo sunaikinimą.
@Service // pagal nutylėjimą singleton — vienas bendras OrderService visai programai
public class OrderService { }
@Component
@Scope("prototype") // šviežia instancija kiekvienam getBean/inject
public class ReportBuilder { }
Klasikiniai spąstai: prototype įterpimas į singleton. Singleton sujungiamas vieną kartą, todėl amžinai laiko vieną prototype instanciją — pažadas „nauja kaskart“ sugriūva. Ištaisykite tai su @Lookup, ObjectProvider<ReportBuilder> arba scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // vykdoma po priklausomybių įterpimo, prieš naudojimą
public void open() { /* atverti socketus, pašildyti cache */ }
@PreDestroy // vykdoma tvarkingo konteinerio išjungimo metu (tik singletonams)
public void close() { /* atlaisvinti resursus */ }
}
Svarbu: Spring nekviečia @PreDestroy prototype beanams — jis juos perduoda ir nustoja sekti, todėl jūs atsakingi už jų valymą.
Tai atskiria žmones, traktuojančius Spring kaip magiją, nuo tų, kurie supranta konteinerį. Singletono, laikančio prototype, klaida yra mėgstamas interviu scenarijus, nes jis subtilus ir sukelia realias produkcines klaidas. Žinojimas, kad singletonai turi būti be būsenos ir thread-safe (jie dalijami tarp visų kreipinių gijų), yra praktinė išvada, kurios interviuotojai klausosi.
IT pokalbių klausimų biblioteka su išsamiais atsakymais — nuo Junior iki Senior.
Paaukoti