Bean Scope, Spring container tarafından oluşturulan nesnenin (Bean) yaşam döngüsünü ve paylaşım modelini belirler.
- Bu nesneden (Bean) kaç tane oluşturulacak ?
- Oluşturulan nesne ne kadar süre yaşayacak ?
- Kimler bu nesnenin aynısını paylaşacak, kimler yenisine sahip olacak ?
Scope olarak defaultta "singleton".
Spring container bir bean için bir tane instance oluşturur ve default olarak onu bellekte cacheler ve bütün bean için bütün dependency injections aynı bean'a referans verecektir.
Spring Bean Scopes
- singleton : Spring, bu Bean'dan uygulama çalıştığı sürece sadece bir tane oluşturur. Eğer ki bu bean'a ihtiyaç duyan (injection) diğer tüm sınıflar, her zaman bu bellekteki aynı (tek) nesneyi kullanır. Örnek : Bir veritabanı ayar sınıfı (DatabaseConfig) veya bir @Service katmanı. Tüm uygulamanın aynı veritabanı ayarlarına veya aynı servise erişmesi gerekir. Yeni bir ayar nesnesine gerek yoktur.
- prototype : Spring, bu Bean'a her ihtiyaç duyduğunda (injection) sürecinde yeni bir nesne oluşturur. Nesne paylaşımı yoktur. Örnek : Bir alışveriş sepeti (ShoppingCart). Her kullanıcı sisteme girdiğinde, kendine ait, sıfırdan oluşturulmuş, başkasıyla paylaşılmayan yeni bir alışveriş sepetine ihtiyacı vardır. Eğer sepet singleton olsaydı, herkes aynı sepete ürün eklerdi!
- request : Gelen her bir HTTP isteği için (request) yeni bir nesne oluşturulur. Kullanıcının web tarayıcısındaki her bir tıklaması bir istektir. O istek tamamlandığında kullanıcıya cevap döndüğünde bu nesne yok edilir. Örnek : O anki isteğe özel kullanıcı bilgilerini tutan bir nesne. Bir kullanıcı /profil sayfasını istediğinde oluşan Bean, başka bir kullanıcının aynı anda /anasayfa isteği için oluşan Bean'den farklıdır.
- application : Tüm web uygulaması (Servlet Context) için bir tane nesne oluşturulur. Uygulama sunucuda çalıştığı sürece yaşar. singleton'a çok benzer ancak web ortamına özeldir. Örnek : Tüm kullanıcıların paylaşması gereken uygulama sayaçları (örn: siteyi o an ziyaret eden toplam kişi sayısı) veya uygulama genelindeki ortak ayarlar.
- session : Her bir kullanıcı oturumu (session) için bir tane nesne oluşturulur. Kullanıcı siteye giriş yaptığında bir oturum başlar ve tarayıcısını kapatana (veya oturumu sonlandırana) kadar bu nesne yaşar. Kullanıcının giriş (login) bilgileri. Kullanıcı site içinde farklı sayfalara (farklı request'lere) gitse bile, aynı oturumda olduğu sürece aynı giriş bilgisi nesnesini kullanmaya devam eder.
- websocket : Her bir WebSocket bağlantısının yaşam süresi boyunca bir tane nesne oluşturulur. Bir chat uygulamasında, o an bağlı olan tek bir kullanıcının bağlantı bilgilerini tutan bir nesne. Her chat penceresi (her bağlantı) kendi özel Bean'ine sahip olur.
@Component
@Primary
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // defaultta budur.
public class MathTeacher implements Teacher{
public MathTeacher() {
System.out.println("MathTeacher başlatıldı");
}
@Override
public String getName() {
return "Minter Math";
}
}@RestController
public class BeanScopesRestController {
private Teacher firstTeacher;
private Teacher secondTeacher;
@Autowired
public BeanScopesRestController(Teacher firstTeacher, Teacher secondTeacher) {
this.firstTeacher = firstTeacher;
this.secondTeacher = secondTeacher;
}
@RequestMapping(path="/beanscope",method=RequestMethod.GET)
public String getScope(){
return "firstTeacher == secondTeacher ====> " +(firstTeacher==secondTeacher);
}
}Eğer ki Scope'yi PROTOTYPE olarak değiştirirsek:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)