Bir bean scope'u, container'ın kaç örnek oluşturacağını ve bunların ne kadar yaşayacağını kontrol eder. Yaşam döngüsü callback'leri, bir bean oluşturulduktan hemen sonra ve yok edilmeden hemen önce kod çalıştırmanıza olanak tanır.
Bir bean scope'u, container'ın kaç örnek oluşturacağını ve bunların ne kadar yaşayacağını kontrol eder. Yaşam döngüsü callback'leri, bir bean oluşturulduktan hemen sonra ve yok edilmeden hemen önce kod çalıştırmanıza olanak tanır.
@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 { }
Klasik tuzak: bir prototype'ı bir singleton'a enjekte etmek. Singleton bir kez bağlanır, bu yüzden sonsuza dek tek bir prototype örneği tutar — "her seferinde yeni" vaadi bozulur. Bunu @Lookup, bir ObjectProvider<ReportBuilder> veya scoped-proxy ile düzeltin.
@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 */ }
}
Önemli: Spring, prototype bean'lerde @PreDestroy'u çağırmaz — onları teslim eder ve izlemeyi bırakır, dolayısıyla temizliklerinin sahibi sizsiniz.
Bu, Spring'i sihir olarak görenleri container'ı anlayanlardan ayırır. Prototype tutan singleton hatası, ince olduğu ve gerçek üretim hatalarına yol açtığı için favori bir mülakat senaryosudur. Singleton'ların durumsuz (stateless) ve thread-safe olması gerektiğini (tüm istek thread'leri arasında paylaşıldıkları için) bilmek, mülakatçıların dinlediği pratik çıkarımdır.
Junior'dan Senior'a detaylı cevaplarla bir BT mülakat soruları kütüphanesi.
Bağış Yap