按照DispatchServlet的要求使用ContextLoaderListener

5

我希望同时使用ContextLoaderListener(这样我可以将Spring Beans传递给我的servlet)和DispatchServlet(Spring MVC)。然而,目前我必须向这两个类的初始化程序传递init参数:

<param-name>contextConfigLocation</param-name>
<param-value>
    /WEB-INF/spring/app-config.xml
</param-value>

所以,我在这两个类中使用相同的xml。想知道这是否会导致我的bean被初始化两次?如果是,我该如何避免?

3个回答

12
无论是ContextLoaderListener还是DispatcherServlet,都可以选择是否设置contextConfigLocation参数。
对于ContextLoaderListener来说,默认值为/WEB-INF/application.xml;对于DispatcherServlet来说,默认值为/WEB-INF/servletname-servlet.xml
如果您显式设置了这些参数,则不应将它们设置为相同的值。ContextLoaderListenerDispatcherServlet应该具有不同的bean定义集合,以避免重复实例化bean。

1
那么,这两个是否有办法共享同一组bean呢? - Phương Nguyễn
1
@Phuong:Servlet的bean将可以访问由监听器加载的上下文中的bean。这些上下文形成了父子关系。这些bean是由父级“拥有”的,但对子级可见。 - skaffman
哦,我读了你在这里的一篇帖子:https://dev59.com/wEnSa4cB1Zd3GeqPOHr8,并且问题被解释得更清晰了。我会尝试看看是否可以避免重复使用我的bean。谢谢。 - Phương Nguyễn
你好 @skaffman,我尝试了您的建议,但在使用类似这样的文件时,使用资源<mvc:resources mapping="/content/games/**" location="file:${admin.content.path}/Games/Images/" />遇到了问题。我在这里发布了一个帖子http://stackoverflow.com/questions/9311741/how-to-configure-dispatcherservlet-and-contextloaderlistener-in-order-to-give-wa。如果您能看一下,我将不胜感激。谢谢 - black sensei

6

若要使用来自ContextLoaderListenercontext强制初始化DispatcherServlet,则应将contextConfigLocation设置为空:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:spring-context.xml
    </param-value>
</context-param>

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

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

0
也可以尝试这个方法, - 在Bean上下文中排除控制器扫描。
<context:annotation-config/>
<context:component-scan base-package="com.test.example">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

在调度器Servlet上下文中,仅扫描控制器

<context:component-scan base-package="com.test.example"  use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<context:annotation-config/>

https://www.concretepage.com/spring/spring-component-scan-include-and-exclude-filter-example


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接