類名:AbstractApplicationContext
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var5) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);
this.destroyBeans();
this.cancelRefresh(var5);
throw var5;
}
}
}
1、prepareRefresh();
容器刷新前的準備,設置上下文狀態,獲取屬性,驗證必要的屬性等
2、obtainFreshBeanFactory();
獲取新的beanFactory,銷燬原有beanFactory、爲每個bean生成BeanDefinition等
3、prepareBeanFactory(beanFactory);
配置標準的beanFactory,設置ClassLoader,設置SpEL表達式解析器,添加忽略注入的接口,添加bean,添加bean後置處理器等
4、postProcessBeanFactory(beanFactory);
模板方法,此時,所有的beanDefinition已經加載,但是還沒有實例化。
允許在子類中對beanFactory進行擴展處理。比如添加ware相關接口自動裝配設置,添加後置處理器等,是子類擴展prepareBeanFactory(beanFactory)的方法
5、invokeBeanFactoryPostProcessors(beanFactory);
實例化並調用所有註冊的beanFactory後置處理器(實現接口BeanFactoryPostProcessor的bean,在beanFactory標準初始化之後執行)。
例如:
PropertyPlaceholderConfigurer(處理佔位符)
6、registerBeanPostProcessors(beanFactory);
spring源碼04——AbstractApplicationContext.registerBeanPostProcessors
實例化和註冊beanFactory中擴展了BeanPostProcessor的bean。
例如:
AutowiredAnnotationBeanPostProcessor(處理被@Autowired註解修飾的bean並注入)
RequiredAnnotationBeanPostProcessor(處理被@Required註解修飾的方法)
CommonAnnotationBeanPostProcessor(處理@PreDestroy、@PostConstruct、@Resource等多個註解的作用)等。
7、initMessageSource();
初始化國際化工具類MessageSource
8、initApplicationEventMulticaster();
初始化事件廣播器
9、onRefresh();
模板方法,在容器刷新的時候可以自定義邏輯,不同的Spring容器做不同的事情。
10、registerListeners();
註冊監聽器,廣播early application events
11、finishBeanFactoryInitialization(beanFactory);
實例化所有剩餘的(非懶加載)單例
比如invokeBeanFactoryPostProcessors方法中根據各種註解解析出來的類,在這個時候都會被初始化。
實例化的過程各種BeanPostProcessor開始起作用。
12、finishRefresh();
refresh做完之後需要做的其他事情。
清除上下文資源緩存(如掃描中的ASM元數據)
初始化上下文的生命週期處理器,並刷新(找出Spring容器中實現了Lifecycle接口的bean並執行start()方法)。
發佈ContextRefreshedEvent事件告知對應的ApplicationListener進行響應的操作