1. 程式人生 > >Spring容器初始化過程都做了哪些事兒

Spring容器初始化過程都做了哪些事兒

1.ClassPathXmlApplicationContext為入口構造方法中有個refresh()方法用來初始化Spring
refresh執行的大致流程:
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();—-2
invokeBeanFactoryPostProcessors(beanFactory);——————————3
registerBeanPostProcessors(beanFactory);———————————–4
initMessageSource();——————————————————-5
initApplicationEventMulticaster();—————————————–6
onRefresh();—————————————————————7
registerListeners();——————————————————-8
beanFactory.preInstantiateSingletons();————————————9
publishEvent(new ContextRefreshedEvent(this));—————————–10

2.解析XML並且初始化工廠類,BeanFactory工廠提供了獲得bean例項的能力,通過AbstractApplicationContext類中的obtainFreshBeanFactory方法呼叫refreshBeanFactory例項化一個預設的BeanFactory工廠DefaultListableBeanFactory,然後呼叫loadBeanDefinitions裝載配置檔案,解析配置檔案(XmlBeanDefinitionReader)時會建立BeanDefinition並且放到容器DefaultListableBeanFactory中去

3.執行工廠後置處理器,這時會查詢所有BeanFactory(DefaultListableBeanFactory)工廠中的bean找出所有BeanFactoryPostProcessor實現類bean,並且呼叫方法postProcessBeanDefinitionRegistry,這個方法可以在bean例項化之前修改配置資訊(比如變數值)


PS:使用者自定義BeanFactoryPostProcessor

4.註冊後置處理器,這時會查詢所有BeanFactory(DefaultListableBeanFactory)工廠中的bean找出所有BeanPostProcessor實現類bean,並且把他們註冊到BeanFactory容器中去,和第3種工廠後置處理器的區別是BeanFactoryPostProcessor會立即呼叫,而BeanPostProcessor註冊到BeanFactory中
PS:使用者自定義BeanPostProcessor

5.預設註冊一個bean名稱為messageSource的bean用於國際化處理,這裡Spring自帶很多種實現,這個方法會先查詢BeanFactory中的bean是否有messageSource名稱的bean如果沒有給一個預設的實現DelegatingMessageSource


PS:使用者可以自定義名稱為messageSource的bean,只需要實現MessageSource即可

6.Spring事件體系包括三個元件:事件,事件監聽器,事件廣播器。這裡是初始化事件廣播器,如果使用者有自定義applicationEventMulticaster名稱的bean並且實現ApplicationEventMulticaster則不需要處理,如果沒有就給一個預設的實現SimpleApplicationEventMulticaster
PS:使用者可以自定義名稱applicationEventMulticaster並且實現ApplicationEventMulticaster介面的bean

7.初始化一些特殊的bean,一般很少用

8.Spring事件體系包括三個元件:事件,事件監聽器,事件廣播器。這裡是事件監聽器,上下文會在BeanFactory找到所有實現ApplicationListener的bean然後新增到事件廣播器ApplicationEventMulticaster中去

9.初始化單例的bean,例項化BeanFactory中所有的bean,(Spring配置的是單例設定scope=”prototype”可以配置多例模式)

10.釋出上下文重新整理事件,事件廣播器負責將些事件廣播到每個註冊的事件監聽器中,容器啟動完成