Spring 启动时最重要的方法refresh(),
1. 在obtainFreshBeanFactory();中创建所有对象的BeanDefinition
2. 在finishBeanFactoryInitialization(beanFactory);中创建真正的单例对象,及其依赖对象的绑定
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 得到所有对象的BeanDefinition
// 告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从
// 子类的refreshBeanFactory()方法启动
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
AbstractApplicationContext.refreshBeanFactory();
AbstractApplicationContext.loadBeanDefinitions(beanFactory);
AbstractXmlApplicationContext.loadBeanDefinitions(beanDefinitionReader);
// 为BeanFactory配置容器特性,例如类加载器、事件处理器等
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// 为容器的某些子类指定特殊的BeanPost事件处理器
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 调用所有注册的BeanFactoryPostProcessor的Bean
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// 为BeanFactory注册BeanPost事件处理器.
// BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// 初始化信息源,和国际化相关.
// Initialize message source for this context.
initMessageSource();
// 初始化容器事件传播器.
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// 调用子类的某些特殊Bean初始化方法
// Initialize other special beans in specific context subclasses.
onRefresh();
// 为事件传播器注册事件监听器
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 初始化容器内所有剩余的单例对象,对象间的依赖关系也在此维护
finishBeanFactoryInitialization(beanFactory);
beanFactory.preInstantiateSingletons();
for (String beanName : beanNames) {
getBean(beanName);
}
// 初始化容器的生命周期事件处理器,并发布容器的生命周期事件
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}