Sobes.tech
Middle+

Springде эки Singleton түзүү мүмкүнбү?

sobes.tech AI

AIден жооп

Ооба, мүмкүн:

  1. Ар кандай контексттер: Ар бир Spring контекст (мисалы, эки AnnotationConfigApplicationContext) өзүнүн бинов топтомун башкаргандыктан, анын ичинде singletonдар да бар. Ар бир контекст өзүнүн singleton үлгүсүнө ээ болот.

    // Singleton бин
    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("Singleton 1 from context 1, ID: " + singleton1.getInstanceId()); // Чыгуу: 1
    
            ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
            MySingleton singleton2 = context2.getBean(MySingleton.class);
            System.out.println("Singleton 2 from context 2, ID: " + singleton2.getInstanceId()); // Чыгуу: 2
        }
    }
    
  2. Ар кандай бин IDлери (эгер бир класс бир нече жолу аныкталган болсо): Эгер бир эле класс бир контекстте ар кандай бин IDлери менен катталса, Spring ар бир ID үчүн өзүнчө singleton түзөт. Бул так эле "бул" класстын эки singleton'у эмес, эки башка бина, ар бири singleton чектөөсү менен жана бир эле реализация классын колдонуп.

    // Ар кандай 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("Singleton A ID: " + singletonA.getInstanceId()); // Чыгуу: 1
            System.out.println("Singleton B ID: " + singletonB.getInstanceId()); // Чыгуу: 2
        }
    }
    

Бул мүмкүнчүлүктөр бар болсо да, стандарттык жана эң кеңири колдонулган Singleton колдонуу Springде бир экземплярды белгилүү бир класс үчүн бир ApplicationContext ичинде болууну билдирет.