Spring-ში ორი Singleton-ის შექმნა შესაძლებელია?
sobes.tech AI
პასუხი AI-სგან
დიახ, შესაძლებელია:
-
სხვადასხვა კონტექსტები: თითოეული Spring კონტექსტი (მაგალითად, ორი
AnnotationConfigApplicationContext) მართავს თავის ბინების ნაკრებს, მათ შორის სინგლტონებს. თითოეულ კონტექსტში იქნება თავისი სინგლტონის ეგზემპლარი.// სინგლტონის ბინი public class MySingleton { private static int counter = 0; private int instanceId; public MySingleton() { instanceId = ++counter; } public int getInstanceId() { return instanceId; } }// ბინის კონფიგურაცია import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MySingleton mySingleton() { return new MySingleton(); } }// სხვადასხვა კონტექსტების გამოყენება 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("სინგლტონი 1 კონტექსტიდან, ID: " + singleton1.getInstanceId()); // გამოტანა: 1 ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class); MySingleton singleton2 = context2.getBean(MySingleton.class); System.out.println("სინგლტონი 2 კონტექსტიდან, ID: " + singleton2.getInstanceId()); // გამოტანა: 2 } } -
სხვადასხვა ბინის ID-ები (თუ ბინი რამდენიმე ჯერ არის განსაზღვრული): თუ ერთი და იგივე კლასი რეგისტრირებულია ერთ კონტექსტში სხვადასხვა ბინის ID-ებით, Spring-ის მიერ ავტომატურად შექმნილი იქნება თითოეული ID-ისთვის ცალკე სინგლტონი. ეს არ არის პირდაპირ "ორი სინგლტონი ამ კლასი", არამედ ორი სხვადასხვა ბინი, რომლებსაც აქვთ სინგლტონის სფერო და იყენებენ ერთსა და იმავე კლასს.
// კონფიგურაცია სხვადასხვა ID-ებით 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(); } }// ბინების გამოყენება სხვადასხვა ID-ებით 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("სინგლტონი A ID: " + singletonA.getInstanceId()); // გამოტანა: 1 System.out.println("სინგლტონი B ID: " + singletonB.getInstanceId()); // გამოტანა: 2 } }
მიუხედავად შესაძლებლობებისა, სტანდარტული და ყველაზე გავრცელებული გამოყენება Spring-ში სინგლტონის არის ერთეული ბინის შექმნა კონკრეტული კლასი ერთი ApplicationContext-ის ფარგლებში.