1. Spring IOC的容器體系
IOC容器是Spring的核心模塊监署,是抽象了對象管理辈末、依賴關(guān)系的框架解決方案亡驰。Spring 提供了很多容器锯七,其中BeanFactory是頂層容器(跟容器)源织,不能被實例化翩伪,它定義了所有IOC容器必須遵從的一套原則,具體的容器實現(xiàn)可以增加額外的功能谈息,比如我們常用的缘屹、ApplicationContext,其下更具體的實現(xiàn)如ClassPathXmlApplicationContext包含了解析xml等一系列的內(nèi)容侠仇,
AnnotationConfigApplicationContext則是包含了注解解析等一系列的內(nèi)容轻姿。Spring IOC容器繼承體系非常聰明,需要使用哪個層次用哪個層次即可逻炊,不必使用功能大而全的互亮。
BeanFactory 頂級接口方法棧如下(Spring-beans:5.2.15.release)
BeanFactory 容器繼承體系
通過其接口設(shè)計,可以看到我們一貫使用的ApplicationContext除了繼承BeanFactory的子接口余素,還繼承了ResourceLoader豹休、MessageSource等接口,因此其提供的功能也就更豐富了桨吊。
2. Bean生命周期關(guān)鍵時機點
關(guān)鍵點 | 觸發(fā)代碼 |
---|---|
構(gòu)造器 | AbstractApplicationContext#refresh# finishBeanFactoryInitialization(beanFactory) |
BeanFactoryPostProcessor 初始化 | AbstractApplicationContext#refresh# invokeBeanFactoryPostProcessors(beanFactory) |
BeanFactoryPostProcessor 方法調(diào)用 | AbstractApplicationContext#refresh# invokeBeanFactoryPostProcessors(beanFactory) |
BeanPostProcessor 初始化 | AbstractApplicationContext#refresh# registerBeanPostProcessors(beanFactory) |
BeanPostProcessor 方法調(diào)用 | AbstractApplicationContext#refresh# finishBeanFactoryInitialization(beanFactory) |
3. Spring IOC容器初始化主流程
由上分析可知威根,Spring IOC容器初始化的關(guān)鍵環(huán)節(jié)就在AbstractApplicationContext#refresh()方法中窑眯,我們查看refresh方法來俯瞰容器創(chuàng)建的主體流程,主體流程下的具體子流程我們后面再討論医窿。
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 第一步:刷新前的預(yù)處理
prepareRefresh();
/*第二步:
獲取BeanFactory磅甩;默認實現(xiàn)是DefaultListableBeanFactory
加載BeanDefinition并注冊到 BeanDefinitionRegistry
*/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 第三步:BeanFactory的預(yù)準(zhǔn)備工作(BeanFactory進行一些設(shè)置,比如context的類加載器等)
prepareBeanFactory(beanFactory);
try {
// 第四步:BeanFactory準(zhǔn)備工作完成后進行的后置處理工作
postProcessBeanFactory(beanFactory);
// 第五步:實例化并調(diào)用實現(xiàn)了BeanFactoryPostProcessor接口的bean
invokeBeanFactoryPostProcessors(beanFactory);
// 第六步:注冊BeanPostProcessor姥卢,在創(chuàng)建bean的前后執(zhí)行
registerBeanPostProcessors(beanFactory);
// 第七步:初始化MessageSource組件
initMessageSource();
// 第八步:初始化事件派發(fā)器
initApplicationEventMulticaster();
// 第九步:子類重寫這個方法卷要,在容器刷新的時候可以自定義邏輯
onRefresh();
// 第十步:注冊應(yīng)用的監(jiān)聽器。就是注冊實現(xiàn)了ApplicationListener接口的監(jiān)聽器bean
registerListeners();
/*
第十一步:
初始化所有剩下的非懶加載的單例bean
初始化創(chuàng)建非懶加載方式的單例bean實例(未設(shè)置屬性)
填充屬性
初始化方法調(diào)用(比如調(diào)用afterPropertiesSet方法独榴、init-method方法)
調(diào)用BeanPostProcessor(后置處理器)對實例bean進行后置處理
*/
finishBeanFactoryInitialization(beanFactory);
/*
第十二步:
完成context的刷新僧叉。主要是調(diào)用LifecycleProcessor的onRefresh()方法,并且發(fā)布事件(ContextRefreshedEvent)
*/
finishRefresh();
}
......
}
}