Springda ikkita Singleton yaratish mumkinmi?
sobes.tech AI
AIdan javob
Ha, mumkin:
-
Turli kontekstlar: Har bir Spring konteksti (masalan, ikkita
AnnotationConfigApplicationContext) o'zining beanlar to'plamini, jumladan singletonlarni, boshqaradi. Har bir kontekstda o'zining singleton nusxasi bo'ladi.// Singleton bean public class MySingleton { private static int counter = 0; private int instanceId; public MySingleton() { instanceId = ++counter; } public int getInstanceId() { return instanceId; } }// Bean konfiguratsiyasi import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MySingleton mySingleton() { return new MySingleton(); } }// Turli kontekstlardan foydalanish import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context1 = new AnnotationConfigApplicationContext(AppConfig.class); MySingleton singleton1 = context1.getBean(MySingleton.class); System.out.println("Kontekst 1 dan singleton, ID: " + singleton1.getInstanceId()); // Chiqish: 1 ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class); MySingleton singleton2 = context2.getBean(MySingleton.class); System.out.println("Kontekst 2 dan singleton, ID: " + singleton2.getInstanceId()); // Chiqish: 2 } } -
Bean ID'lari farqli bo'lishi (agar bean bir necha marta ta'riflangan bo'lsa): Agar bir xil klass bir kontekstda turli bean ID'lar bilan ro'yxatdan o'tkazilsa, Spring har bir ID uchun alohida singleton yaratadi. Bu "bu klassning ikki singletoni" emas, balki har biri singleton bo'lgan va bir xil amalga oshirish klassidan foydalanadigan ikki turli bean.
// Turli ID'lar bilan konfiguratsiya import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DifferentIdConfig { @Bean(name = "singletonA") public MySingleton mySingletonA() { return new MySingleton(); } @Bean(name = "singletonB") public MySingleton mySingletonB() { return new MySingleton(); } }// Turli ID'lar bilan beanlardan foydalanish import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class MainDifferentId { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(DifferentIdConfig.class); MySingleton singletonA = context.getBean("singletonA", MySingleton.class); MySingleton singletonB = context.getBean("singletonB", MySingleton.class); System.out.println("Singleton A ID: " + singletonA.getInstanceId()); // Chiqish: 1 System.out.println("Singleton B ID: " + singletonB.getInstanceId()); // Chiqish: 2 } }
Oddiy va eng keng tarqalgan foydalanishda, Springda singleton odatda bir ApplicationContext doirasida bir marta aniqlangan bean'ning yagona nusxasini anglatadi.