2012-05-28 7 views
8

bekomme ein Problem in meine Feder Anwendung.Spring Singleton wird zweimal aufgerufen

Ich habe sehr einfache Frühlingsbohnen, sie werden in verschiedene andere Frühlingsbohnen injiziert. Während des Debuggens, das ich gefunden habe, werden sie zweimal aufgerufen, Konstruktor & @PostConstruct beide zweimal aufgerufen.

Meine Anwendung hat keine Front-End-Technologie. Es ist einfach für die Backend-Aufgabe verwandt.

Federkonfiguration

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd"> 


    <context:component-scan base-package="com.green.integration" /> 

    <!-- ######################################################## --> 
    <!-- EXPOSING SPRING BEAN VIA HTTPINVOKER SPRING REMOTING --> 
    <!-- ######################################################## --> 

    <bean name="/switch" 
     class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> 
     <property name="service" ref="SwitchController" /> 
     <property name="serviceInterface" 
      value="com.green.ISwitchController" /> 
    </bean> 

    <!-- Load in application properties reference --> 
    <bean id="applicationProperties" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="classpath:application.properties" /> 
    </bean> 


    <bean id="mongo" class="com.mongodb.Mongo"> 
     <constructor-arg value="${mongo.server}" /> 
     <constructor-arg value="${mongo.port}" /> 
    </bean> 

    <bean id="morphia" class="com.google.code.morphia.Morphia"> 
    </bean> 


</beans> 

Frühlings-Bean-Klasse

@Repository 
public class TransactionDAO extends BasicDAO<Transaction, ObjectId> { 
    private Datastore datastore; 

    @Autowired 
    public TransactionDAO(Mongo mongo, Morphia morphia) { 
     super(mongo, morphia, "itransact"); 
     morphia.map(Transaction.class); 
     // TO USE MONGO WITHOUT SECURITY 
     this.datastore = morphia.createDatastore(mongo, "itransact"); 
     logger.debug("***** CONNECTED TO MONGODB SUCCESSFULLY *****"); 
     this.datastore.ensureIndexes(); 
     // this.datastore.ensureCaps(); 
    } 
} 

Constructor "TransactionDAO" zweimal aufgerufen wird.

Ich habe versucht, Call-Stack-Trace von

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

und jedes Mal, es zeigte den folgenden

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
+1

Sind Sie absolut sicher, dass '@ PostConstruct' auch doppelt aufgerufen wird? Konstruktor, der zweimal aufgerufen wird, kann leicht erklärt werden, aber nicht '@ PostConstruct'. –

+0

Haben Sie eine Dispatcher-Servlet-Konfiguration? –

+0

Vielleicht haben Sie Ihren XML-Anwendungskontext aus der XML-Konfigurationsdatei eines anderen Kontexts über importiert? –

Antwort

16

ich gerade herausgefunden das Problem und besonderen Dank an @Juan Alberto zu sehen, den ich geben andeuten zu dem Problem.

Beschreibung: Eigentlich gab ich die eine applicationContext.xml-Datei für ContextListner und Dispatcher-Servlet. So initiierte 1. Bean für Federkern und 2. Zeit für Feder Dispatcher.

Ich habe jetzt die Konfiguration in applicationContext.xml und applicationContext-dispatcher.xml verschüttet, die nur ihre relevanten Konfigurationen haben und meine Beans werden einmal richtig initialisiert.

Problematische Configs

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 


<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 

Gelöst Configs

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 


<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext-dispatcher.xml</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
+4

Ich verstehe nicht, was wir enthalten sollten "applicationContext-dispatcher.xml" und was sollte in "applicationContext.xml" gesetzt werden –

5

Eigentlich Ihr Problem ist, dass Sie die Bohnen können in der Dispatcher Servlet werden definiert, und auch Ihre Feder Zusammenhang sieht der Disponent eine andere Kontext, aber es (ein Subkontext, denke ich) des Hauptkontextes, so ist der richtige Weg, Dinge zu tun, wenn Ihr Hauptkontext Ihre "Modellklassen" scannt und der Dispatcher nur nach den Controllern sucht.

Ich hoffe, das hilft Ihnen.

Verwandte Themen