主要可以归纳为三个步骤:
- 初始化容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
- 将配置类的BeanDefinition注册到容器中
- 调用refresh()方法刷新容器。
Spring IOC 以xml的形式启动Spring容器的过程: 配置:xml -> ClassPathApplicationContext -> refresh
初始化容器
初始化容器主要 做了三个事情:
- 实例化BeanFactory(DefaultListableBeanFactory)工厂,用于生成Bean的对象
- 实例化BeanDefinitionReader(注解配置读取器), 用于特定注解类的读取(如@Service等)进行读取转换为BeanDefinition对象
- 实例化ClassPathBeanDefinitionScanner路径扫描器,用于指定包目录进行扫描查找bean
注册SpringConfig配置类到容器中
配置文件中的bean,注解标识的beanrefresh刷新容器
- 设置beanFactory的类加载器
将配置文件解析成一个个的BeanDefinition,注册到beanFactory
只是提供了bean的配置信息,此时并没有初始化 同时设置了两个属性:是否允许bean覆盖,是否允许循环引用
如果bean实现了BeanFactoryPostProcessor, 将会执行postBeanFactoryPostProcessor
到这里bean注册加载完成,但是没有初始化
注册BeanPostProcessor的实现类,BeanPostProcessor将在bean初始化前后执行
- 初始化当前的ApplicationContext的messageSource,国际化
- 初始化当前ApplicationContext的事件广播器
- onRefresh() . 钩子方法初始化自定义的bean
- 注册事件监听器,监听器需要实现ApplicationListener接口
- 实例化、初始化所有非懒加载的bean
- 广播事件,ApplicationContext初始化完成。