Spring容器启动的整个过程实际上就包含在AbstractApplicationContext的refresh方法中
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
/** 这里会重新设置容器启动时间和启动标志字段*/
prepareRefresh();
/**
* 通知子类刷新beanFactory,具体实现在 AbstractRefreshableApplicationContext中,
* 1.如果当前Context持有beanFactory,则先destoryBeans,再关闭beanFactory
* 2.createBeanFactory:用父容器创建一个DefaultListableBeanFactory,(这里如果父容器为ConfigurableApplicationContext,
* 则返回该context持有的beanFacotry,否则直接返回父BeanFactory。ps:这里可能就是context和beanFactory的区分点)
* 3.customizeBeanFactory:根据参数设置是否允许子类定制DefaultListableBeanFactory。
* 4.loadBeanDefinitions:加载BeanDefinitions,具体实现在AbstractXmlApplicationContext中。(TODO:后面会详细扩展讲解)
* 并返回子类的beanFactory
*/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
/**
* 这个方法主要是为后面实例化bean做一些设置
* 1.设置ClassLoader
* 2.addPropertyEditorRegistrar,设置用户定义的propertyEditor注册器
* 3.addBeanPostProcessor,设置ApplicationContextAwareProcessor, 处理ApplicationContextAware实现接口的Bean。
* 4.ignoreDependencyInterface,设置不解析某些接口的依赖关系
* 5.registerResolvableDependency,设置特殊接口和bean的绑定关系
*/
prepareBeanFactory(beanFactory);
try {
/** 提供接口给子类修改beanFactory。 */
postProcessBeanFactory(beanFactory);
/** 调用注册的BeanFactoryPostProcessor,按照实现的排序接口PriorityOrdered>Ordered>无接口 */
invokeBeanFactoryPostProcessors(beanFactory);
/** 按照排序接口,依次注册BeanPostProcessor,后面会按照这个顺序调用 */
registerBeanPostProcessors(beanFactory);
/**
* 初始化messageSource,(MessageSource接口用于支持国际化)如果context中尤定义id为messageSource
* 的MessageSource接口的bean(潜规则),则采用它来解析Message资源,否则采用父容器messageSource,这里会创建一个DelegatingMessageSource,
* 避免为空的情况导致调用失败。
*/
initMessageSource();
/**
* 初始化并注册ApplicationEventMulticaster,容器事情广播器,同样采用MessageSource类似的潜规则,
* 如果容器中有名为applicationEventMulticaster且实现了ApplicationEventMulticaster接口的bean,则注册它,
* 否则创建SimpleApplicationEventMulticaster,将它当作默认的广播器。
*/
initApplicationEventMulticaster();
/** 给子类保留的接口,通知子类刷新 */
onRefresh();
/** 获取容器中定义的所有ApplicationListener,容器事件监听器,并注册 */
registerListeners();
/**
* 1.清除用于类型匹配的classLoader
* 2.冻结bean definitions中设置,不能再修改bean的配置
* 3.实例化非延迟加载的单例bean,包括由FactoryBean实例化的bean(TODO:需要进一步深挖)
*/
finishBeanFactoryInitialization(beanFactory);
/** 广播ContextRefreshedEvent容器刷新事件。 */
finishRefresh();
}
catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
beanFactory.destroySingletons();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}