Sobes.tech
Middle+

Vai ir iespējams izveidot divus Singleton Spring?

sobes.tech AI

Atbilde no AI

Jā, tas ir iespējams:

  1. Dažādi konteksti: Katrs Spring konteksts (piemēram, divi AnnotationConfigApplicationContext) pārvalda savu binu kopumu, ieskaitot singletonus. Katrs konteksts saturēs savu singletona eksemplāru.

    // Singleton bin
    public class MySingleton {
        private static int counter = 0;
        private int instanceId;
    
        public MySingleton() {
            instanceId = ++counter;
        }
    
        public int getInstanceId() {
            return instanceId;
        }
    }
    
    // Bina konfigurācija
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class AppConfig {
        @Bean
        public MySingleton mySingleton() {
            return new MySingleton();
        }
    }
    
    // Dažādu kontekstu izmantošana
    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 no konteksta 1, ID: " + singleton1.getInstanceId()); // Izvade: 1
    
            ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
            MySingleton singleton2 = context2.getBean(MySingleton.class);
            System.out.println("Singleton 2 no konteksta 2, ID: " + singleton2.getInstanceId()); // Izvade: 2
        }
    }
    
  2. Dažādi binu ID (ja binu definē vairākas reizes): Ja tas pats klases eksemplārs ir reģistrēts vienā kontekstā ar dažādiem binu ID, Spring automātiski izveidos atsevišķu singletonu katram ID. Tas nav tieši "divi singletoni šīs klases", bet divi dažādi binu eksemplāri, katrs ar savu singletona darbības jomu un izmanto vienu un to pašu klases realizāciju.

    // Konfigurācija ar dažādiem 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();
        }
    }
    
    // Binu izmantošana ar dažādiem 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()); // Izvade: 1
            System.out.println("Singleton B ID: " + singletonB.getInstanceId()); // Izvade: 2
        }
    }
    

Neskatoties uz iespējām, standarta un visbiežāk izmantotais singleton modelis Spring ietvaros ir viens konkrēta klases instances vienā ApplicationContext.