AbstractApplicationContext#refresh
1 | public void refresh() throws BeansException, IllegalStateException { |
1. prepareRefresh()
- 设置启动时间
startupDate为当前毫秒值 - 启动标志
active为true - 执行子类重载方法:
AbstractRefreshableWebApplicationContext#initPropertySources, 将当前应用的servletContext和servletConfig添加到属性源 - 执行
AbstractEnvironment#validateRequiredProperties, 确保必要属性非空
2. obtainFreshBeanFactory()
主要作用: 创建BeanFactory, 加载BeanDefinition.
内部主要调用AbstractRefreshableApplicationContext#refreshBeanFactory, 定义如下
1 | protected final void refreshBeanFactory() throws BeansException { |
createBeanFactory()通过new DefaultListableBeanFactory创建了Bean工厂, 也就是Spring默认的工厂类是DefaultListableBeanFactorycustomizeBeanFactory实际是调用的子类重载的方法AbstractRefreshableApplicationContext#customizeBeanFactory, 该方法内是配置Bean工厂的allowBeanDefinitionOverriding和allowCircularReferences属性loadBeanDefinitions()方法用来加载BeanDefinition, 实际调用的是子类重载的方法AbstractXmlApplicationContext#loadBeanDefinitions(DefaultListableBeanFactory)
3. prepareBeanFactory(beanFactory)
主要作用: 配置Bean工厂, 将内部的一些类ignore或注册为可依赖的, 主要调用ConfigurableListableBeanFactory#ignoreDependencyInterface 和 ConfigurableListableBeanFactory#registerResolvableDependency.
4. postProcessBeanFactory(beanFactory)
实际调用子类重载方法AbstractRefreshableWebApplicationContext#postProcessBeanFactory. 该方法主要:
- 向Bean工厂添加
ServletContextAwareProcessorBean后置处理器 - 配置Bean工厂, 忽略
ServletConfigAware和ServletContextAware接口依赖
5. invokeBeanFactoryPostProcessors(beanFactory)
调用所有的BeanFactoryPostProcessor, myBatis的MapperScannerConfigurer就是在此刻向Bean工厂注入了Mapper接口的BeanDefinition, 这个BeanDefinition都是工厂类, 最终调用MapperFactoryBean生成实现类.
6. registerBeanPostProcessors(beanFactory)
将Bean工厂里的BeanPostProcessor类型的Bean先实例化, 然后通过ConfigurableBeanFactory#addBeanPostProcessor将这些Bean存到beanPostProcessors属性里
7. initMessageSource()
初始化MessageSource, 该类主要是为系统提供国际化支持, 可以输出不同语言的提示信息
8. initApplicationEventMulticaster()
初始化Spring事件多播器, 默认创建一个SimpleApplicationEventMulticaster实例
9. onRefresh()
给AbstractApplicationContext的子类一个参与refresh的机会, 其中AbstractRefreshableWebApplicationContext#onRefresh初始化了主题资源
10. registerListeners()
将保存在容器中的事件监听器ApplicationListener对象注册到Spring事件多播器中
11. finishBeanFactoryInitialization(beanFactory)
实例化容器中剩余的单例Bean
12. finishRefresh()
初始化生命周期处理器, 默认实例化DefaultLifecycleProcessor, 并发布容器刷新时间ContextRefreshedEvent
13. destroyBeans()
清空容器中保存bean的相关属性
14. cancelRefresh(ex)
设置启动标志为false