Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?
Cevap
Varsayılan scope singleton'dır: container başına bean'in tek bir örneği oluşturulur ve herkes onu paylaşır.
| Scope | Ömür |
|---|---|
| singleton | ApplicationContext başına tek örnek (varsayılan) |
| prototype | Her getBean() / injection'da yeni örnek |
| request | HTTP isteği başına bir örnek (web) |
| session | HTTP session başına bir örnek (web) |
| application | ServletContext başına bir örnek |
| websocket | WebSocket session başına |
Singleton bean'ler thread-safe mi?
Spring bunu garanti etmez. Singleton bean'ler tüm istekler arasında paylaşıldığı için mutable instance alanı tutmamalıdır (stateless olmalı). İstek başına veri lokal değişkenlerde veya parametrelerde taşınır.
Tuzak: singleton içine prototype
Injection yalnızca singleton oluşturulurken bir kez yapılır; bu yüzden singleton içindeki prototype bean de aslında hep aynı örnek olur. Çözümler:
@Service
public class ReportService {
private final ObjectProvider<ReportBuilder> builderProvider;
public ReportService(ObjectProvider<ReportBuilder> builderProvider) {
this.builderProvider = builderProvider;
}
public Report create() {
ReportBuilder b = builderProvider.getObject(); // her seferinde yeni prototype
return b.build();
}
}Diğer seçenekler: @Lookup metot injection veya @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS). Request scope bean'leri singleton'a inject ederken Spring zaten scoped proxy kullanır.
İlgili Java & Spring soruları
- Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?
- ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?
- JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?
- @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.
- Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?
- Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.