Bir bean’in context’i, kullandığımız bağlamlarda o bean’in yaşam döngüsünü ve oluşumunu tanımlar. Spring framework çatısında 6 adet bean scope bulunmaktadır:
- singleton
- prototype
Yalnızca web uyumlu uygulamalar ile kullanılabilen scope’lar ise:
- request
- session
- application
- websocket
Spring Bean Scope Nedir?
Spring Framework içinde “scope” bir nesnenin yaşam döngüsünü ve ne kadar süreyle erişilebilir olduğunu tanımlayan bir kavramdır. Spring, çeşitli nesne scope’ları sağlar ve bu scope’lar nesnelerin oluşturulma, kullanılma ve yok edilme şeklini belirler.
Bu scope’lar, Spring uygulamalarında nesnelerin nasıl yönetileceğini belirlemek için kullanılır. Scope belirleme, nesnelerin doğru zamanda oluşturulması, paylaşılması ve yok edilmesi açısından önemlidir ve uygulamanın performansı ve davranışı üzerinde etkili olabilir.
Spring Framework’de en yaygın olarak kullanılan scope’lar şunlardır:
1. Singleton Scope
Bir bean default olarak singleton scope’a sahiptir. Bean singleton scope ile tanımlandığı zaman mevcut application context‘imiz içerisinde o bean’den yalnızca ve yalnızca tek bir adet initialize edileceğini garanti ederiz. Bu bean ile yapılacak olan tüm request’ler cache’lenmiş olan aynı nesne üzerinden yapılır. Bean nesnemiz üzerinde yapılan bir değişiklik bean’i kullanan tüm yerlerde etkilecektir. Scope notasyonun singleton için iki farklı kullanımını aşağıda görebilirsiniz.
@Bean @Scope("singleton") //@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) public MyBean myBean() { return new MyBean(); }
2. Prototype Scope
Prototype ile belirlenmiş bir bean, container içerisinde çağırıldığı her request’te yeniden oluşturulacaktır. Scope notasyonun iki farklı kullanımını aşağıda görebilirsiniz.
@Bean @Scope("prototype") //@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public MyBean myBean() { return new MyBean(); }
3. Request Scopes
Request scope değeri her bir http request’i bir adet bean oluştururur. Örnek bir bean’i şu şekilde oluşturabiliriz:
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
//@RequestScope
public MyBean myBean() {
return new MyBean();
}
Web application context’inin örneklenmesi esnasında aktif bir request olmadığından dolayı proxyMode tanımının yapılması gereklidir. Spring framework, dependency olarak inject edilecek bir proxy oluşturur ve bir request’e ihtiyaç duyulduğunda ilgili scope’a sahip olan bean’i örnekler. Ayrıca, yukarıdaki @Scope tanımı için bir kısayol görevi gören @RequestScope notasyonunu da kullanabiliriz.
4. Session Scope
Session scope değeri her bir http session’ı için bir adet bean oluşturur. Örnek bir bean’i şu şekilde oluşturabiliriz:
@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
//@SessionScope
public MyBean myBean() {
return new MyBean();
}
5. Application Scope
Bir application scope, ServletContext’in yaşam döngüsü için bean örneğini oluşturur. Bu singleton scope’a benzer ancak aralarında farklılıklar mevcuttur. Bir bean application scope değerine sahipken bu bean çoklu servlet tabanlı uygulamalar ile de paylaşılabilirken, singleton scope değerine sahip bir bean yalnızca mevcut application context’i içerisinde tanımlıdır.
@Bean @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) //@ApplicationScope public MyBean myBean() { return new MyBean(); }
6.WebSocket Scope
WebSocket scope’a sahip bean’ler tipik olarak singleton scope yapısındadır ve herhangi bir WebSocket oturumundan daha uzun yaşar. Bu nedenle, WebSocket scope’una sahip bean’ler için bir proxyMode tanımı gerekir. Singleton davranış sergilediğini, ancak yalnızca bir WebSocket sesion’ı ile sınırlı olduğunu da söyleyebiliriz.
@Bean Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS) public MyBean myBean() { return new MyBean(); }
Scope yasam sürelerini anlatmaniz cok iyi olmus. Elinize saglik