如何使Spring MVC只创建1个Spring上下文?

时间:2018-03-22 00:33:13

标签: java spring spring-mvc

我有一个使用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上下文来处理所有内容,这样我就不会有多个副本一起运行?

2 个答案:

答案 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,基本上是ServiceDAO s。

如果您使用的是组件扫描,则可以使用context:exclude-filtercontext: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>