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
singletonApplicationContext başına tek örnek (varsayılan)
prototypeHer getBean() / injection'da yeni örnek
requestHTTP isteği başına bir örnek (web)
sessionHTTP session başına bir örnek (web)
applicationServletContext başına bir örnek
websocketWebSocket 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.

  1. Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?OrtaJava & SpringBackend
  2. ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?OrtaJava & SpringBackend
  3. JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?OrtaJava & SpringBackend
  4. @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.ZorJava & SpringBackend
  5. Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?KolayJava & SpringBackend
  6. Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?ZorJava & SpringBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle