Middle+
Vai ir iespējams izveidot divus Singleton Spring?
sobes.tech AI
Atbilde no AI
Jā, tas ir iespējams:
-
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 } } -
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.