前言

Spring的加载机制,一直都不是很清楚,本次通过debug,查了相关源码,整理出整体调用链,为日后学习使用

本文仅自己学习笔记!

AbstractBeanFactory -> DefaultListableBeanFactory

AbstractApplicationContext.refresh

  • obtainFreshBeanFactory DefaultListableBeanFactory

  • finishBeanFactoryInitialization

    AbstractXmlApplicationContext

    loadDefiniton

    解析xml

    DefaultListableBeanFactory.beanDefinitionMap(beanName, beanDefinition)

DefaultSingletonBeanRegistry 是 DefaultListableBeanFactory 父类

DefaultSingletonBeanRegistry.singletonObjects(beanName, Object)

初始化 applicaionContext

AbstractApplicationContext.refresh()

  • prepareRefresh()

    启动时间 启动状态 initPropertySources(子类实现)

  • obtainFreshBeanFactory
    获取beanFactory DefaultListableBeanFactory
    loadBeanDefinitions 加载bean配置 到 DefaultListableBeanFactory.beanDefinitionMap
    BeanDefinitionReader.loadBeanDefinitions
    AbstractBeanDefinitionReader.loadBeanDefinitions 最终是调用 子类的loadBeanDefinitions 如 XmlBeanDefinitionReader
    经过各种xml解析 通过建造者模式 BeanDefinitionHolder 生成 BeanDefinition
    加载完成 放入 beanDefinitionMap key:beanName value:BeanDefinition

  • prepareBeanFactory 给DefaultListableBeanFactory 准备相应的属性 以及 实例化环境所需要的 bean
    实例化后存入 DefaultListableBeanFactory.singletonObjects 中
  • postProcessBeanFactory 子类实现
  • invokeBeanFactoryPostProcessors
  • registerBeanPostProcessors
  • initMessageSource
  • initApplicationEventMulticaster
  • onRefresh
  • registerListeners
  • finishBeanFactoryInitialization 实例化 beanDefinitionMap 中的 bean non-lazy-init
    DefaultListableBeanFactory.preInstantiateSingletons
    根据之前的beanDefinitionMap 中的 BeanDefinition 进行实例化
    非抽象 单例 非懒加载
    AbstractBeanFactory.getBean

    先看内存中有没有 有就直接取内存中,没有则创建

    循环依赖检测

    看是否有父工厂

    有就用父类工厂创建

    内存中标记为创建,存储在 alreadyCreated Set

    创建依赖的bean

    AbstractAutowireCapableBeanFactory.doCreateBean 创建

    createBeanInstance

    autowireConstructor

    instantiateBean

    反射生成bean

    生成好了 放入 DefaultListableBeanFactory的 singletonFactories registeredSingletons

    populateBean

    initializeBean
    init-method 执行
    提前曝光 处理循环依赖
    registerDisposableBeanIfNecessary
    之后再放入 singletonObjects registeredSingletons

  • finishRefresh
    清理clearResourceCaches
    initLifecycleProcessor
    监听