Kontext-Verwirrung - Spring, der Singleton-Beans zweimal instanziiert

8

Ich mache meine Spring-Konfiguration programmatisch. Ich bekomme nicht die Injektionsergebnisse, die ich erwarte, also habe ich mir die Protokolle angesehen und aus irgendeinem Grund erzeugt Spring meine Singleton-Bohnen zweimal.

Ich bekomme das in Tomcat Start-up Logs

%Vor%

Ist das normales Verhalten?

Dies ist mein Anwendungskontext

%Vor%

Dies ist mein Servlet-Kontext

%Vor%

Und meine Servlet-Initialisierungsklasse namens BidAppInitializer

%Vor%

Dies ist mein vollständiges Tomcat-Startprotokoll:

%Vor%     
Sotirios Delimanolis 25.02.2013, 05:00
quelle

2 Antworten

13

Singleton garantiert eine einzelne Instanz im Spring-Container. Das bedeutet, dass Sie so viele singleton -Instanzen haben können, wie Container vorhanden sind (selbst wenn sie den gleichen JVM-Klassenlader verwenden). Siehe Der Singleton-Bereich und diese Antwort für Singleton Design Pattern vs. Singleton Bean

In Ihrem Fall instanziieren Sie zwei Kontexte - rootContext und servletContext und von denen Log-Statements stammen.

Wenn Sie eine einzelne Instanz jedes Singletons haben möchten, könnten Sie diese beiden Kontexte zusammenführen.

Kleine Java-Klasse, die ein solches Verhalten veranschaulicht (Entschuldigung für die seltsame Code-Formatierung - wollte es prägnanter machen):

%Vor%     
Petro Semeniuk 27.02.2013, 05:29
quelle
0

Es gibt zwei Arten von Kontexten, von denen einer der Wurzelkontext und der andere der Kontext der Webanwendung ist.

Wenn in WebAppInitalizer, wo Sie erweitern, erweitert AbstractAnnotationConfigDispatcherServletInitializer-Klasse Stellen Sie sicher, dass

Sie überschreiben die folgenden Methoden und stellen sicher, dass die Klassendefinition in den beiden Methoden nicht wiederholt wird.

@Override     Geschützte Klasse [] getServletConfigClasses () {         gebe neue Klasse zurück [] {MvcConfig.class};     }

%Vor%     
Rahul Tokase 24.11.2016 16:07
quelle

Tags und Links