主要可以归纳为三个步骤:

  1. 初始化容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
  2. 将配置类的BeanDefinition注册到容器中
  3. 调用refresh()方法刷新容器。

    Spring IOC 以xml的形式启动Spring容器的过程: 配置:xml -> ClassPathApplicationContext -> refresh

初始化容器

初始化容器主要 做了三个事情:

  1. 实例化BeanFactory(DefaultListableBeanFactory)工厂,用于生成Bean的对象
  2. 实例化BeanDefinitionReader(注解配置读取器), 用于特定注解类的读取(如@Service等)进行读取转换为BeanDefinition对象
  3. 实例化ClassPathBeanDefinitionScanner路径扫描器,用于指定包目录进行扫描查找bean

    注册SpringConfig配置类到容器中

    配置文件中的bean,注解标识的bean

    refresh刷新容器

  • 设置beanFactory的类加载器
  • 将配置文件解析成一个个的BeanDefinition,注册到beanFactory

    只是提供了bean的配置信息,此时并没有初始化 同时设置了两个属性:是否允许bean覆盖,是否允许循环引用

  • 如果bean实现了BeanFactoryPostProcessor, 将会执行postBeanFactoryPostProcessor

    到这里bean注册加载完成,但是没有初始化

  • 注册BeanPostProcessor的实现类,BeanPostProcessor将在bean初始化前后执行

  • 初始化当前的ApplicationContext的messageSource,国际化
  • 初始化当前ApplicationContext的事件广播器
  • onRefresh() . 钩子方法初始化自定义的bean
  • 注册事件监听器,监听器需要实现ApplicationListener接口
  • 实例化、初始化所有非懒加载的bean
  • 广播事件,ApplicationContext初始化完成。