为什么我的Spring ContextRefreshedevent被调用了两次?

时间:2011-05-28 21:53:54

标签: java spring spring-mvc

我注册了一个Spring ApplicationListener bean来监听ContextRefreshed事件。但是出于一些奇怪的原因,我在完成上下文初始化时会对onApplicationEvent(ContextRefreshedEvent)方法进行两次调用。这是正常行为还是表示我的配置有问题?我正在使用Jetty 8作为我的Servlet容器。

我的相关web.xml配置如下

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/spring/spring-config.xml</param-value>
</context-param>
<servlet>
    <servlet-name>Spring</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>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet-mapping>
    <servlet-name>Spring</servlet-name>
    <url-pattern>/service/*</url-pattern>
</servlet-mapping>

谢谢!

4 个答案:

答案 0 :(得分:25)

即使您没有为DispatcherServlet指定contextConfigLocation,它仍然会创建子上下文,而第二个刷新的事件是针对该上下文的。使用event.getApplicationContext()来查找事件的上下文。

答案 1 :(得分:2)

它也发生在我身上,在另一个事件听众身上。 (ApplicationListener<AuthenticationFailureBadCredentialsEvent>

我怀疑 ContextLoaderListener ,当我从web.xml中删除声明时,该应用程序正常运行。然后我必须弄清楚它的目的是什么,ContextLoaderListener ......

Role/Purpose of ContextLoaderListener in Spring?

有趣的答案是:

  

ContextLoaderListener是可选的。只是为了说明一点:你可以   无需配置即可启动Spring应用程序   ContextLoaderListener ...只是基本的最小web.xml   DispatcherServlet的

答案 2 :(得分:1)

看起来像虫子。

https://jira.springsource.org/browse/SPR-6589

如果您使用3.0,请在最新版本3.05上试用。

答案 3 :(得分:1)

我也有这个问题,但修好了。我正在将dataSource注入到我的DAO中(并使用它实例化JdbcTemplate)....但我也为JDBCTemplate配置了一个Spring bean。

我本应该用jdbcTemplate注入我的DAO ...避免重复。