2012-05-28 51 views
8

讓我的春天的應用程序出現問題。春天的單身人士被稱爲兩次

我有非常簡單的彈簧豆,它們被注入到各種其他彈簧豆。當我發現調試時,他們被調用兩次,構造函數& @PostConstruct都被調用了兩次。

我的應用程序沒有前端技術。它只是爲後端任務相關。

Spring配置文件

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

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

構造 「TransactionDAO」 被稱爲兩次。

我試着看調用堆棧跟蹤由

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

每一次都表現出以下

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

你絕對相信'@ PostConstruct'也被調用兩次嗎?被稱爲兩次的構造函數可以很容易地解釋,但不能'@ PostConstruct'。 –

+0

您有調度程序servlet配置嗎? –

+0

也許你有你的應用程序上下文xml從另一個上下文的xml配置文件通過導入? –

回答

16

我只是想出了這個問題,並特別感謝@Juan阿爾貝託誰給我提示解決問題。

描述:其實我爲contextListner和dispatcher servlet提供了一個applicationContext.xml文件。所以1st bean初始化爲Spring核心,第二次爲Spring調度員。

現在我把配置分散到applicationContext.xml和applicationContext-dispatcher.xml中,它們只有它們的相關配置,我的bean正確初始化一次。

有問題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> 

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

我不明白我們應該把什麼包含在'applicationContext-dispatcher.xml'中,以及應該放在'applicationContext.xml'中 –

5

其實你的問題是,你可能會被定義豆在調度員的servlet,也是你的Spring上下文,調度員提供了不同上下文,但它(主要上下文我認爲)的主要上下文,所以正確的做事方式是讓你的主要上下文掃描你的「模型類」,調度員只是掃描控制器。

我希望這可以幫助你。