我有一个使用Spring MVC的网络应用程序。许多Spring组件都会旋转线程并执行大量异步处理。我注意到Web应用程序似乎运行了比它应该更多的异步进程,所以我调查了一下,我意识到由于某种原因我的Web应用程序启动了2个Spring上下文 - 使用相同的Spring XML配置file - 意味着每个Spring bean的2个副本,以及应该有的异步线程和后台进程的两倍。我已经看到了许多关于Spring MVC和多个Spring上下文的其他stackoverflow问题,这些问题有助于解释为什么Spring允许这种行为,但这些答案都没有解释如何解决这个问题只能使用1个Spring上下文。看到这个问题的回答是什么?#34;是的,你只能有一个上下文"但没有解释如何实现这一目标:https://stackoverflow.com/a/18698392/367544
这是我的web.xml
文件:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/application-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>...</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/app/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/application-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringDispatcherServlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
如您所见,application-config.xml
Spring XML配置文件被多次引用(一次在&#34; context-param&#34;一次在&#34; servlet&#34;),所以我尝试从头开始删除这部分:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/application-config.xml</param-value>
</context-param>
但这使我的网络应用无法启动。如何修复我的web.xml
文件,只使用一个全局Spring上下文来处理所有内容,这样我就不会有多个副本一起运行?
答案 0 :(得分:0)
我能够通过删除&#34; context-param&#34;来解决它。部分,也是&#34;听众&#34;部分:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-configuration/application-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
答案 1 :(得分:0)
使用2个不同的.xml文件,一个定义弹簧上下文,按ContextLoaderListener
加载。另一个定义MVC上下文,加载DispatcherServlet
。
在MVC上下文中,定义所有bean仅用作&#34;调度程序&#34;,即Controller
s,其他bean不使用它。
在Spring上下文中,定义所有其他bean,基本上是Service
和DAO
s。
如果您使用的是组件扫描,则可以使用context:exclude-filter
和context:include-filter
在Spring上下文中:
<context:component-scan base-package="scan.package">
<context:exclude-filter
type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter
type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
在MVC上下文中:
<context:component-scan base-package="scan.package">
<context:include-filter
type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter
type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>