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]