Sobes.tech
Middle+

Spring-ში ორი Singleton-ის შექმნა შესაძლებელია?

sobes.tech AI

პასუხი AI-სგან

დიახ, შესაძლებელია:

  1. სხვადასხვა კონტექსტები: თითოეული 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
        }
    }
    
  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-ის ფარგლებში.