SpringMVC在啟動完成後執行方法
阿新 • • 發佈:2019-02-04
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.xml
和spring-mvc.xml
兩個檔案, 針對這兩個檔案.
- Spring裡獲取bean的邏輯是:如果在自身的容器中沒有找到該物件,那麼就去parent container中查詢(相關原始碼參見
AbstractBeanFactory
類中的doGetBean
方法–[(parentBeanFactory != null && !containsBeanDefinition(beanName))
- 而Spring中的事件通知邏輯如下: 先向自身的容器發起事件通知,如果本容器有parent container存在,則在parent container進行一次通知(相關原始碼參見
AbstractApplicationContext
類中的publishEvent
方法) - 所以:
- parent container(
spring.xml
作為配置檔案)
由ContextLoaderListener
(org.springframework.web.context.ContextLoaderListener
)載入 - child container(
spring-mvc.xml
作為配置檔案) – 由DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
)載入
- parent container(