Singleton Tasarım Deseni ve Bean Scope
Tags: singleton, spring, bean, java
Published: 2023-10-15 20:27:24

# Singleton
Uygulamada birçok nesne tarafından yeniden kullanılması amaçlanan tek bir instance'a ihtiyaç duyulan durumlarda kullanılır. Spring'de, bu nesneleri Spring'in singleton bean'leri kullanarak veya Singleton tasarım desenini kendimiz uygulayarak oluşturabiliriz. Singleton, nesnelerin tekrar tekrar oluşturulmasının maliyetini önlemek veya bir nesneyi paylaşmanın gerektiği durumlar için idealdir.

Singleton pattern implementasyonu, bir nesnenin gerçekten ihtiyaç duyulana kadar oluşturulmasını geciktirmek için genellikle tembel (lazy) başlatmayı kullanır. Yani bir nesnenin gerçekten ihtiyaç duyulana kadar oluşturulmasını erteleyerek, kaynak kullanımını ve performansı optimize edebilir.

Spring çerçevesinde bir "bean," Spring IoC konteyneri içinde oluşturulan, yönetilen ve sonlandırılan bir nesnedir.

# Bean Scope
Spring bean'leri ile bir nesneyi, Inversion of Control(IoC) kullanarak, metadata aracılığıyla Spring container'ı enjekte edebiliriz. Bu, bir nesnenin bağımlılıklarını oluşturmadan tanımlayabilmesini ve bu işi IoC container'ına devredebilmesini sağlar.

Spring çerçevesinin en son sürümü altı tür kapsam tanımlar:

1. Singleton
2. Prototype
3. Request
4. Session
5. Application
6. WebSocket

Bir bean'in scope'u, yaşam döngüsünü ve görünürlüğünü tanımlar. Ayrıca bir bean'in gerçek instancelarının nasıl oluşturulacağını belirler.

### Singleton Scope
Bir bean'i singleton scope ile tanımladığımızda, container o bean'in yalnızca bir instance oluşturur; bu bean adı için gelen tüm istekler aynı nesneyi döndürecektir ve bu nesne önbelleğe alınır. Nesnenin herhangi bir değişikliği, bean'e yapılan tüm isteklerde yansıtılır. Eğer başka bir kapsam belirtilmemişse, varsayılan olarak Singleton değerindedir.

###Prototype Scope
Prototype scope'a sahip bir bean, her seferinde container istendiğinde farklı bir instance döndürecektir. Bu, bean tanımında @Scope açıklamasına prototype değerini ayarlayarak tanımlanır.

###Request Scope
Bir bean, her HTTP isteği için ayrı bir instance oluşturur. Yani bir istek aldığında yanıt verilene kadar bir instance kullanılır ve yeni bir istek geldiğinde farklı bir instance bean tarafından oluşturulur. Request scope, yalnızca web uygulamaları için geçerlidir.

###Session Scope
Bir bean, her HTTP oturumu için ayrı bir instance oluşturur. Bu, aynı kullanıcının oturumu boyunca aynı bean instance'ı paylaşmanızı sağlar. Session kapsamı da yalnızca web uygulamaları için geçerlidir.

###Application Scope
Application kapsamı, yine yalnızca web uygulamaları için geçerlidir. Bir bean, bir ServletContext'in yaşam döngüsü boyunca aynı örneği oluşturur. Bu, tüm uygulama boyunca aynı bean instance'ı paylaşmanızı sağlar. ServletContext, bir Java web uygulamasının çalıştığı sunucu ortamında, tüm web bileşenlerinin paylaştığı bir nesnedir.

###WebSocket Scope
WebSocket kapsamı da web uygulamaları ile ilişkilidir ve belirli bir WebSocket oturumu için bir bean instance oluşturur. Bu, WebSocket oturumu süresince aynı bean örneğini paylaşmanızı sağlar.

##References##

- [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans)
- [Quick Guide to Spring Bean Scopes](https://www.baeldung.com/spring-bean-scopes)