İlk konu olarak girdiğim bir mülakatta bilemediğim JAVA Bean Scope kullanımı hakkında olacak.
Bean Nedir ?
Bean, java spring’in iskeletini oluşturan objeler diyebiliriz. IoC containerları tarafından yönetilen objelere bean denir. Buradaki amaç projenin her yerinde farklı farklı yönetimi zorlaştıracak nesneler üretmek yerine bunu tek bir koldan yönetilmektir. Bu şekilde bağımlılıkları en aza indirmek hedeflenir.
Bean Scope nedir?
Bean scope’lar yukarıda belirttiğimiz beanlerin yaşam sürelerini tanımladığımız anotasyonlardır. Bu şekilde tek bir yerden oluşturulan bean için oluşturulan instance mı kullanılsın ? Ne zaman yeni bir instance oluşsun? gibi tanımlamaları yapabiliriz. 5 farklı scope bulunmaktadır.

Günümüzden örnek vermek gerekirse bir elbise odanızın(Container) olduğunu düşünün. Dışarı çıkarken giymek için bir pantolon alıyorsunuz(instance üretme) bunu kullanıyorsunuz sonra tekrar kullanmak için yerine koyup tekrar tekrar(singleton) kullanabiliyorsunuz. Bu şekilde daha az masraf yapmış oluyorsunuz ancak bir kere kullandığınız maskeyi atıp sonrasında yenisini kullanmanız gerekiyor. Bu şekilde her seferinde yeni bir maske(prototype) almak zorunda oluyorsunuz. Günümüz ile ilgili böyle bir örnek verebiliriz.

1- Singleton(varsayılan)
Hiç bir scope belirtmezsek varsayılan bean scope singleton dir. Bir instance üretildiğinde container içinde saklanır. Herhangi bir ihtiyaç halinde yeni bir instance üretmek yerine bu instance kullanılır. Singleton desing pattern gibi düşünebilirsiniz.
2- Prototype
Scope olarak Prototype belirttiğimiz bean’lerde her kullanılmak istendiğinde yeni bir instance üretilmesi sağlanır.
3- Request
Web tabanlı uygulamalarda kullanılır. HTTP istediği geldiği anda instance üretilmesi sağlanır.
4- Session
Web tabanlı uygulamalarda kullanılır. HTTP session oluştuğunda instance üretilmesi sağlanır
5- Global-Session
Web tabanlı uygulamalarda kullanılır. HTTP isteği geldiğinde sadece bir tane instance üretilmesi sağlanır. Her seferinde aynı instance kullanılmaktadır.
Örnek Kullanımı
@Scope("prototype")
public class Personal{
...
}