1. 程式人生 > >SpringMVC在啟動完成後執行方法

SpringMVC在啟動完成後執行方法

2017/5/19 9:34:22 使用markdown重新編輯,並引入新的參考連結。
2017/10/26 19:58:49 修改格式.

第一個版本釋出於 2017-02-08 23:23

通過實現ApplicationListener來達到在spring容器載入完畢時來作出某些自定義的操作,關於這一點想必很多人都知道了,本篇文件當然不會是這類被很多前人講述了一遍又一遍的東西。

今天所要講的是在SpringMVC中在上面實現的方法會被Spring回撥兩次,如果你是因為這個問題而找到了這篇文章,那麼恭喜你達到了終點,在下面的內容裡我會給出解決方案和產生這種現象的原因。

解決方案

不要在spring.xml中註冊上面那個實現了ApplicationListener<ContextRefreshedEvent>介面的類,去spring-mvc.xml中進行註冊即可。

原因

我們一般會有spring.xmlspring-mvc.xml兩個檔案, 針對這兩個檔案.

  1. Spring裡獲取bean的邏輯是:如果在自身的容器中沒有找到該物件,那麼就去parent container中查詢(相關原始碼參見AbstractBeanFactory類中的doGetBean方法–[(parentBeanFactory != null && !containsBeanDefinition(beanName))
    ])
  2. 而Spring中的事件通知邏輯如下: 先向自身的容器發起事件通知,如果本容器有parent container存在,則在parent container進行一次通知(相關原始碼參見AbstractApplicationContext類中的publishEvent方法)
  3. 所以:
    1. parent container(spring.xml作為配置檔案)
      ContextLoaderListener(org.springframework.web.context.ContextLoaderListener)載入
    2. child container(spring-mvc.xml作為配置檔案) – 由 DispatcherServlet
      (org.springframework.web.servlet.DispatcherServlet)載入

參考連結