Sobes.tech
Middle+

Spring-də iki Singleton yaratmaq mümkündürmü?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, mümkündür:

  1. Fərqli kontekstlər: Hər Spring konteksti (məsələn, iki AnnotationConfigApplicationContext) öz binalar dəstini idarə edəcək, o cümlədən singletonları. Hər kontekstin öz singleton nümunəsi olacaq.

    // Singleton bina
    public class MySingleton {
        private static int counter = 0;
        private int instanceId;
    
        public MySingleton() {
            instanceId = ++counter;
        }
    
        public int getInstanceId() {
            return instanceId;
        }
    }
    
    // Bina konfiqurasiyası
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class AppConfig {
        @Bean
        public MySingleton mySingleton() {
            return new MySingleton();
        }
    }
    
    // Fərqli kontekstlərin istifadəsi
    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("Singleton 1 from context 1, ID: " + singleton1.getInstanceId()); // Çıxış: 1
    
            ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
            MySingleton singleton2 = context2.getBean(MySingleton.class);
            System.out.println("Singleton 2 from context 2, ID: " + singleton2.getInstanceId()); // Çıxış: 2
        }
    }
    
  2. Fərqli bina ID-ləri (əgər bina bir neçə dəfə müəyyən edilibsə): Eyni sinif bir kontekstdə fərqli bina ID-ləri ilə qeydiyyatdan keçibsə, Spring hər ID üçün ayrıca singleton yaradacaq. Bu, tam olaraq "bu" sinifin iki singletonu deyil, daha çox iki fərqli bina, hər biri singleton sahəsinə malik və eyni sinifin tətbiqindən istifadə edir.

    // Fərqli ID-lərlə konfiqurasiya
    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();
        }
    }
    
    // Fərqli ID-lərlə bina istifadəsi
    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()); // Çıxış: 1
            System.out.println("Singleton B ID: " + singletonB.getInstanceId()); // Çıxış: 2
        }
    }
    

Qeyd etmək lazımdır ki, Spring-də Singleton ən çox istifadə olunan və standart yanaşma, bir ApplicationContext daxilində müəyyən edilmiş bir sinifin bir nümunəsidir.*