Spring MVC – 2回ロードされたBean
春の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 …
上の春の設定では:
-
サーブレット
mvc-dispatcher`は
mvc-dispatcher-servlet.xml`をロードします -
リスナーの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回実行しないようにしてください。
参考文献
IO:The DispatcherServlet]。
http://stackoverflow.com/questions/19826228/spring-web-security-web-xml-mvc-dispatcher-bean-is-created-twice
[StackOverflow
: spring web, security + web.xml + mvc dispatcher + Bean is created twice]