Spring Framefork Bean Scope'unda kullanılan Singleton Pattern'nin bildiğimiz Singleton Patternden farkı nedir?
Spring Framework'te kullanılan Singleton Scope, geleneksel Singleton Pattern'inden birkaç önemli yönden farklılık gösterir. Bu farklılıkları anlamak için önce her iki kavramın temel özelliklerini inceleyelim:
Geleneksel Singleton Pattern
Global Erişim: Singleton, global bir erişim noktası sağlar ve bu sayede uygulamanın her yerinden erişilebilir bir tek nesne (instance) oluşturur.
Tek Nesne Kısıtlaması: Bu pattern, bir sınıftan yalnızca bir nesnenin oluşturulmasını garanti eder. Bu, sınıfın yapıcı metodunun (constructor) özel (private) olması ve sınıfın kendisinden bir static metod aracılığıyla erişilebilen tek bir nesne örneği sağlamasıyla sağlanır.
Lazy Loading: Singleton nesnesi, genellikle ilk kullanıldığında yaratılır (lazy initialization). Bu, kaynakların gereksiz yere kullanılmamasını sağlar.
Thread Safety: Çoklu iş parçacığı (thread) ortamlarında, Singleton nesnesinin oluşturulma süreci genellikle senkronize edilir.
Spring Framework'te Singleton Scope
Spring Container Yönetimi: Spring'de Singleton Scope, Spring IoC (Inversion of Control) container tarafından yönetilir. Bu, Spring'in, belirli bir bean için yalnızca bir nesne örneğini oluşturacağı ve saklayacağı anlamına gelir.
Uygulama Bağlamı Kapsamı: Spring'in Singleton'u, JVM genelinde global bir Singleton değildir. Bunun yerine, Spring uygulama bağlamı (application context) içinde Singleton'dır. Yani, farklı Spring uygulama bağlamları aynı sınıf için birden fazla Singleton nesne örneğine sahip olabilir.
Gelişmiş Yaşam Döngüsü ve Bağımlılık Yönetimi: Spring, bean'lerin yaşam döngüsünü yönetir ve bağımlılık enjeksiyonu (dependency injection) sağlar. Bu, nesneler arasındaki bağımlılıkların kolayca yönetilmesine olanak tanır ve sıkı sınıf bağlantılarını azaltır.
Konfigürasyon Esnekliği: Bean tanımları ve kapsamları, XML, Java Annotation'ları veya Java Config sınıfları gibi çeşitli yollarla yapılandırılabilir.
Özetle Farklar
Kapsam ve Yaşam Süresi: Geleneksel Singleton, global bir kapsam sunarken, Spring Singleton'u yalnızca bir Spring uygulama bağlamında tekildir.
Yönetim ve Konfigürasyon: Spring, bean'lerin yaşam döngüsünü yönetir ve gelişmiş konfigürasyon seçenekleri sunar, geleneksel Singleton'da ise bu tür bir yönetim yoktur.
Bağımlılık Enjeksiyonu: Spring, bağımlılık enjeksiyonu sayesinde daha temiz ve daha az bağımlı kod yazma imkanı tanır.
Sonuç olarak, Spring Framework'teki Singleton Scope, geleneksel Singleton Pattern'den daha esnek bir yapı sunar ve modern uygulama geliştirme ihtiyaçlarına daha uygun özellikler içerir.
Spring'de aynı context'de farklı name'ler ile singelton scupe da aynı sınıftan birden fazla instance üretilebilir, değil mi?
Evet, Spring'de aynı application context içinde farklı isimlerle aynı sınıftan birden fazla Singleton scope bean oluşturabilirsiniz. Spring'de bir bean'in kapsamı (scope), o bean'in yaşam süresini ve nasıl oluşturulup kullanılacağını tanımlar. Singleton scope (varsayılan scope), Spring IoC container'ı tarafından yönetilen her bean için yalnızca bir nesne örneği oluşturulacağını belirtir. Ancak, bu, bir sınıf türü için yalnızca tek bir nesne olabileceği anlamına gelmez. Aynı sınıf türünden farklı isimlerle veya tanımlarla birden fazla bean tanımlayabilirsiniz, ve her biri için Spring container tarafından ayrı bir Singleton nesnesi oluşturulur.
Bu durum, özellikle farklı yapılandırmalara veya bağımlılıklara sahip olmaları gereken, ancak aynı arayüzü veya sınıfı paylaşan bean'ler için kullanışlıdır. Örneğin, aynı veri erişim nesnesi (DAO) sınıfını, farklı veritabanı bağlantıları için kullanabilirsiniz.
java
Copy code
@Component("beanName1")
public class MyBean {}
@Component("beanName2")
public class MyBean {}
Yukarıdaki örnekte, MyBean sınıfından iki farklı bean tanımlanmıştır ve her biri için Spring container aynı sınıfın farklı nesnelerini oluşturacaktır. Bunlar aynı application context içinde yaşarlar ancak farklı isimlere ve bağımsız yaşam döngülerine sahiptirler.
Alternatif olarak, XML yapılandırması veya Java Config sınıfları kullanılarak da aynı sınıf için farklı bean tanımları yapılabilir:
java
Copy code
@Configuration
public class AppConfig {
@Bean(name = "bean1")
public MyBean myBean1() {
return new MyBean();
}
@Bean(name = "bean2")
public MyBean myBean2() {
return new MyBean();
}
}
Bu yapılandırmada, myBean1 ve myBean2 isimleriyle iki farklı MyBean nesnesi oluşturulmuş olur ve her ikisi de Singleton scope altında yönetilir ancak bağımsız nesneler olarak var olurlar. Bu özellik, Spring'in esnekliğini ve gücünü gösterir, çünkü uygulamanızın farklı kısımlarında aynı türdeki nesnelere farklı yapılandırmalar veya durumlar sağlayabilirsiniz.