我注册了一个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>
谢谢!
答案 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)
答案 3 :(得分:1)
我也有这个问题,但修好了。我正在将dataSource注入到我的DAO中(并使用它实例化JdbcTemplate)....但我也为JDBCTemplate配置了一个Spring bean。
我本应该用jdbcTemplate注入我的DAO ...避免重复。