2012-05-28 8 views
8

problema en mi aplicación de primavera.Singleton de primavera que se llama dos veces

Tengo granos de primavera muy simples, que se inyectan en varios otros granos de primavera. Mientras encontré la depuración, se llaman dos veces, el Constructor & @ PostConstruct se llamaron dos veces.

Mi aplicación no tiene tecnología de front-end. Es simplemente para tareas relacionadas con el back-end.

configuración del resorte

<?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> 

beans Spring Clase

@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" está siendo llamado dos veces.

traté de ver seguimiento de la pila de llamadas por

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

y cada vez que mostró la siguiente

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

¿Está absolutamente seguro de que '@ PostConstruct' se llama dos veces también? El constructor que se llama dos veces se puede explicar fácilmente, pero no '@ PostConstruct'. –

+0

¿Tiene una configuración de servlet de despachador? –

+0

¿Quizás tiene su xml de contexto de aplicación importado del archivo de configuración xml de otro contexto a través del ? –

Respuesta

16

Me acabo de descubrir los problemas y agradecimiento especial a @Juan Alberto que me dan insinúo al problema

Descripción: De hecho, estaba dando el archivo applicationContext.xml para el servlet de contextListner y del despachador. Entonces, 1st Bean se estaba inicializando para el núcleo de primavera y 2 ° vez para el despachador de primavera.

Derramé la configuración ahora, en applicationContext.xml y applicationContext-dispatcher.xml que solo tienen sus configuraciones relevantes y mis beans se están inicializando correctamente.

problemáticas configuraciones

<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> 

Configs resueltos

<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

No entiendo qué contenido deberíamos poner en 'applicationContext-dispatcher.xml' y qué debería ponerse en' applicationContext.xml' –

5

En realidad el problema es que es posible que la definición de los granos en el servlet despachador y también su contexto primavera, el despachador proporciona una diferente contexto pero creo que (un contexto secundario) del contexto principal, por lo que la forma correcta de hacer las cosas es hacer que su contexto principal escanee sus "clases modelo" y el despachador solo escanee en busca de los controladores.

Espero que esto te ayude.

Cuestiones relacionadas