Sobes.tech
Middle

Czy istnieje możliwość utworzenia dwóch Singletonów w Springu?

sobes.tech AI

Odpowiedź od AI

Tak, możliwość istnieje, choć jest to sprzeczne z głównym celem wzorca Singleton (pojedynczy egzemplarz). W Springu osiąga się to za pomocą następujących mechanizmów:

  1. Różne konteksty Spring: Jeśli masz dwa różne konteksty Spring (np. w monolitycznej aplikacji podzielonej na moduły, z każdym własnym kontekstem, lub w systemie rozproszonym, gdzie każdy serwis ma własny kontekst), każdy kontekst może zawierać własny egzemplarz beana Singleton.

  2. Scope prototype: Chociaż domyślnie scope dla beanów w Springu to singleton, możesz wyraźnie określić scope="prototype" dla konkretnego beana. Spring wtedy będzie tworzyć nowy egzemplarz tego beana przy każdym żądaniu.

    // Przykład konfiguracji Spring
    @Configuration
    public class AppConfig {
    
        @Bean
        @Scope("prototype") // Określamy scope `prototype`
        public MyPrototypeBean myPrototypeBean() {
            return new MyPrototypeBean();
        }
    }
    
    // Przykład beana
    public class MyPrototypeBean {
        // ...
    }
    
  3. Połączenie z bibliotekami mającymi własne konteksty: Jeśli Twoja aplikacja korzysta z bibliotek, które same inicjują własne konteksty Spring i rejestrują w nich beany Singleton, to w Twojej głównej aplikacji i w tej bibliotece może być po jednym egzemplarzu tej samej klasy, zarejestrowanym jako Singleton w każdym z kontekstów.

Ważne jest, aby zrozumieć, że tworzenie wielu egzemplarzy klasy, która była zaprojektowana jako Singleton, często wskazuje na potencjalny problem w architekturze lub niewłaściwe użycie wzorca. Zazwyczaj, jeśli potrzebne jest więcej niż jedno wystąpienie, scope Singleton jest nieodpowiedni.