春のMVC Webアプリケーションは、すべてのSpringのBeanが2回ロードされていることに気付きました。

package com.mkyong.config.db;

@Configuration
public class MongoDevConfig {

    private final static Logger logger = LoggerFactory.getLogger(MongoDevConfig.class);

    @Bean
    MongoDbFactory mongoDbFactory() throws Exception {

        logger.debug("Init...... MongoDbFactory() in production mode!");
       //...
        return new new SimpleMongoDbFactory(mongo, "db");;

    }

}

アプリケーションの起動時:

2015-03-05 17:52:32 DEBUG c.m.config.MongoLiveConfig - Init...... MongoDbFactory() in production mode!
2015-03-05 17:52:32 DEBUG c.m.config.MongoLiveConfig - Init...... MongoDbFactory() in production mode!

1.春の設定

Spring MVCの設定を次に示します。

web.xml

<web-app>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

</web-app>

mvc-dispatcher-servlet.xml

<beans...>

    <context:component-scan base-package="com.mkyong"/>
    <mvc:annotation-driven/>

</beans>

2.解決策

SpringがXMLファイルをどのように受け取るのかを理解するには、http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-servlet[Spring DispatcherServlet reference]を読んでください。

Upon initialization of a DispatcherServlet, Spring MVC looks for a file
named[servlet-name]-servlet.xml in the WEB-INF directory of your web
application and …​

上の春の設定では:

  1. サーブレット

    mvc-dispatcher`は

    mvc-dispatcher-servlet.xml`をロードします

  2. リスナーのContextLoaderListenerは

再度 `mvc-dispatcher-servlet.xml`を読み込みます

これを修正するために、サーブレット名 `mvc-dispatcher`の名前を変更しました。

web.xml

<web-app>

    <!-- Now it will find hello-dispatcher-servlet.xml -->
    <servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

要するに、SpringがSpringのXML設定を2回実行しないようにしてください。