Bean Scope Nedir

Ertan Usta

Spring’de Bean, Spring Framework tarafından yönetilen ve uygulama bağlamında (context) yaşam döngüsü kontrol edilen bir nesnedir. Spring’in temel yapı taşlarından biri olan bean’ler, uygulamanın bileşenlerini temsil eder. Spring, uygulamanın bağımlılıklarını çözümlemek ve yönetmek için bu nesneleri kullanır.

Spring bean’leri genellikle bir sınıfın örneği (instance) olarak tanımlanır. Bu bean’ler, Spring IoC (Inversion of Control) Container tarafından oluşturulur, yönetilir ve ihtiyaç duyulan yerlere enjekte edilir.

Scope, bir bean’in yaşam döngüsünü tanımlar. Spring, farklı senaryolara uygun çeşitli scope türleri sunarak, bir bean’in tek bir instance’ı mı kullanılacak yoksa her seferinde yeni bir instance mı oluşturulacak gibi sorulara yanıt verir.

Bean’in Özellikleri

  • Bean Tanımlaması: Bean’ler XML dosyaları, Java config sınıfları ya da anotasyonlar yardımıyla tanımlanır.
  • Yaşam Döngüsü Yönetimi: Bean’lerin oluşturulması, başlatılması, yok edilmesi gibi yaşam döngüsü işlemleri Spring Container tarafından kontrol edilir.
  • Scope (Kapsam): Spring’deki bean’ler, farklı kapsamlarla tanımlanabilir (örneğin, singleton, prototype, request, session gibi).
  • Dependency Injection (Bağımlılık Enjeksiyonu): Spring, bean’lerin bağımlılıklarını yönetir ve ihtiyaç duyulan diğer bean’leri enjekte eder.
  • Gevşek Bağlılık (Loose Coupling): Spring bean’leri, bağımlılık enjeksiyonu sayesinde birbirleriyle sıkı sıkıya bağlı değildir, bu da esneklik sağlar.

Scope Türleri

1. Singleton Scope

Spring’in varsayılan bean kapsamıdır. Bir sınıfın yalnızca bir tane instance’ı oluşturulur ve bu instance uygulama boyunca paylaşılır. Yani bir sınıf için yalnızca bir tane bean oluşturulur ve her yerde bu instance kullanılır. Bean, Spring Container başlatıldığında oluşturulur ve tüm uygulama boyunca kullanılır.

@Component
@Scope("singleton")
public class MySingletonBean {
}

2. Prototype Scope

Her talepte yeni bir bean instance’ı oluşturulur. Yani her getBean() çağrısında farklı bir instance alınır. Bu, bir bean’in uygulama boyunca birçok kez yeni instance’lar ile kullanılmasını sağlar. Kaynak tüketimi açısından daha maliyetli olabilir, çünkü her seferinde yeni bir bean oluşturulur. Nesne başlatma ve yok etme süreçleri, Spring tarafından yönetilmez. Spring sadece bean’i oluşturur, ancak yok etme işlemiyle ilgilenmez. Bir veritabanı bağlantısı veya başka bir kaynağa referans vermediği sürece nesne kapsam dışına çıktığında temizlenecektir. Fakat bir referans bağlantısı mevcut ise bir bellek sızıntısı meydana gelebileceğinden ötürü özellikle temizlenmesi gerekmektedir.

@Component
@Scope("prototype")
public class MyPrototypeBean {
    public MyPrototypeBean() {
        System.out.println("Prototype Bean oluşturuldu");
    }
}

3. Request Scope

Her HTTP isteği için yeni bir bean instance’ı oluşturur ve bu bean sadece o HTTP isteği boyunca geçerlidir. HTTP isteği sona erdiğinde bean de yok edilir. Web uygulamalarında her HTTP isteği için ayrı bir bean oluşturulur. Aynı HTTP isteği içinde, bean’in aynı instance’ı kullanılır.

@Component
@Scope("request")
public class MyRequestScopedBean {
    public MyRequestScopedBean() {
        System.out.println("Request Scoped Bean oluşturuldu");
    }
}

4. Session Scope

Her HTTP oturumu (session) için bir bean instance’ı oluşturur ve bu bean sadece oturum boyunca geçerli olur. Oturum sona erdiğinde bean de yok edilir. Aynı oturum içinde bean’in aynı instance’ı kullanılır.

@Component
@Scope("session")
public class MySessionScopedBean {
    public MySessionScopedBean() {
        System.out.println("Session Scoped Bean oluşturuldu");
    }
}

5. Global Session

Genellikle portlet tabanlı web uygulamalarında kullanılır. Her global HTTP oturumu için bir bean instance’ı oluşturulur. Bu scope, standard web uygulamalarında yaygın olarak kullanılmaz.

6. Application Scope

Bir bean’in uygulama genelinde tek bir instance’ının oluşturulup tüm uygulama boyunca kullanıldığı bir scope’tur. Web uygulamaları için kullanılır ve uygulama tüm web istekleri boyunca aynı instance’ı paylaşır.

@Component
@Scope("application")
public class MyApplicationScopedBean {
    public MyApplicationScopedBean() {
        System.out.println("Application Scoped Bean oluşturuldu");
    }
}

7. WebSocket Scope

Her WebSocket oturumu için yeni bir bean instance’ı oluşturur. WebSocket oturumu boyunca bean aynı instance olarak kullanılır, oturum sona erdiğinde bean de yok edilir.

@Component
@Scope("websocket")
public class MyWebSocketScopedBean {
    public MyWebSocketScopedBean() {
        System.out.println("WebSocket Scoped Bean oluşturuldu");
    }
}