Spring Singleton called twice

get some problems in my spring application.

I have a very simple spring beans, they are injected into various other spring beans. During debugging that I found, they are called twice, Constructor and @PostConstruct are called twice.

There is no interface technology in my application. It is easy to work with the database.

Spring Configuration

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

Spring Bean Class

 @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(); } } 

The constructor "TransactionDAO" is called twice.

I tried to see the call stack trace on

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

and every time he showed the following

 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
+8
java spring singleton postconstruct
source share
2 answers

I just realized the problem and special thanks to @Juan Alberto for giving me a hint of this problem.

Description: In fact, I provided one applicationContext.xml file for the contextListner servlet and dispatcher. So, the first bean was initialized for the spring kernel and the 2nd time for the spring manager.

I spilled the configuration now, in applicationContext.xml and applicationContext-dispatcher.xml, which have only the corresponding configurations, and my beans is initialized correctly.

Problem Configurations

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

Solved configurations

 <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> 
+16
source share

Actually, your problem is that you can define beans in the dispatcher servlet, as well as your spring context, the dispatcher provides a different context, but it (as an explicit context) of the main context, so the right way to do what your main context scans your "model classes", and the dispatcher just scans only the controllers.

Hope this helps you.

+5
source share

All Articles