跳转至

Spring 容器加载过程

一、整体流程

启动 → 创建 BeanFactory → 加载 BeanDefinition → 实例化 → 初始化 → 完成

二、详细步骤

1. 创建 BeanFactory

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

2. 加载 BeanDefinition

扫描包,解析 @Component、@Bean,把类信息存成 BeanDefinition:

BeanDefinition {
    beanClassName
    scope
    lazyInit
    constructorArgs
    propertyValues
}

3. BeanFactoryPostProcessor

在 Bean 实例化前,允许修改 BeanDefinition。

4. 实例化 Bean

按 BeanDefinition 创建对象: - 推断构造函数。 - 实例化(new)。 - 属性填充(populateBean)。

5. Aware 接口

  • BeanNameAware
  • BeanFactoryAware
  • ApplicationContextAware

6. BeanPostProcessor 前置

postProcessBeforeInitialization。

7. 初始化

  • afterPropertiesSet
  • init-method

8. BeanPostProcessor 后置

postProcessAfterInitialization(AOP 代理在这里生成)。

9. 完成

单例都实例化完,容器就绪。

三、refresh() 方法

Spring 容器核心方法,做了 13 件事:

  1. prepareRefresh
  2. obtainFreshBeanFactory
  3. prepareBeanFactory
  4. postProcessBeanFactoryFactory
  5. invokeBeanFactoryPostProcessors
  6. registerBeanPostProcessors
  7. initMessageSource
  8. initApplicationEventMulticaster
  9. onRefresh
  10. registerListeners
  11. finishBeanFactoryInitialization(实例化所有单例)
  12. finishRefresh

四、一句话

容器加载 = 读配置 → 实例化 → 填充 → 初始化 → 后置处理。

高频

第 11 步 finishBeanFactoryInitialization 是最核心的,所有单例 Bean 在这一步创建。