全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 10 分钟 ✍️ juanwangdev

ApplicationContext 创建与刷新

ApplicationContext 创建与刷新是 Spring Boot 启动的核心阶段,完成 Bean 定义的加载和实例化。

ApplicationContext 创建

createApplicationContext()

Java
protected ConfigurableApplicationContext createApplicationContext() {
    return this.applicationContextFactory.create(this.webApplicationType);
}

// 默认工厂实现
public ConfigurableApplicationContext create(WebApplicationType webApplicationType) {
    switch (webApplicationType) {
        case SERVLET:
            return new AnnotationConfigServletWebServerApplicationContext();
        case REACTIVE:
            return new AnnotationConfigReactiveWebServerApplicationContext();
        default:
            return new AnnotationConfigApplicationContext();
    }
}

上下文类型选择

WebApplicationTypeApplicationContext
SERVLETAnnotationConfigServletWebServerApplicationContext
REACTIVEAnnotationConfigReactiveWebServerApplicationContext
NONEAnnotationConfigApplicationContext

refresh() 核心流程

AbstractApplicationContext.refresh()

Java
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

        // 1. 准备刷新上下文
        prepareRefresh();

        // 2. 获取 BeanFactory
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 3. 准备 BeanFactory
        prepareBeanFactory(beanFactory);

        // 4. 后处理器处理 BeanFactory
        postProcessBeanFactory(beanFactory);

        // 5. 执行 BeanFactoryPostProcessor
        invokeBeanFactoryPostProcessors(beanFactory);

        // 6. 注册 BeanPostProcessor
        registerBeanPostProcessors(beanFactory);

        // 7. 初始化消息源
        initMessageSource();

        // 8. 初始化事件广播器
        initApplicationEventMulticaster();

        // 9. 初始化特殊 Bean(Web 容器等)
        onRefresh();

        // 10. 注册监听器
        registerListeners();

        // 11. 完成所有 Bean 初始化
        finishBeanFactoryInitialization(beanFactory);

        // 12. 完成刷新
        finishRefresh();
    }
}

prepareRefresh()

初始化准备工作

Java
protected void prepareRefresh() {
    // 设置启动时间
    this.startupDate = System.currentTimeMillis();

    // 设置活跃状态
    this.closed.set(false);
    this.active.set(true);

    // 初始化属性源
    initPropertySources();

    // 校验必要属性
    getEnvironment().validateRequiredProperties();
}

obtainFreshBeanFactory()

BeanFactory 创建

Java
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    // 刷新 BeanFactory
    refreshBeanFactory();

    // 返回 BeanFactory
    return getBeanFactory();
}

protected final void refreshBeanFactory() throws BeansException {
    if (!hasBeanFactory()) {
        // 创建 DefaultListableBeanFactory
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        beanFactory.setSerializationId(getId());
        customizeBeanFactory(beanFactory);
        // 加载 Bean 定义
        loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    }
}

prepareBeanFactory()

BeanFactory 标准配置

Java
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // 设置类加载器
    beanFactory.setBeanClassLoader(getClassLoader());

    // 设置表达式解析器
    beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver());

    // 添加属性编辑器注册器
    beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar());

    // 添加特殊 BeanPostProcessor
    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor());

    // 注册标准环境 Bean
    beanFactory.registerSingleton("environment", getEnvironment());
    beanFactory.registerSingleton("systemProperties", getEnvironment().getSystemProperties());
    beanFactory.registerSingleton("systemEnvironment", getEnvironment().getSystemEnvironment());
}

invokeBeanFactoryPostProcessors()

执行后处理器顺序

Java
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    // 1. 先执行 BeanDefinitionRegistryPostProcessor
    //    - ConfigurationClassPostProcessor(处理 @Configuration)
    //    - 处理 @ComponentScan、@Import 等

    // 2. 后执行普通 BeanFactoryPostProcessor
    //    - PropertySourcesPlaceholderConfigurer
    //    - 自定义后处理器
}

ConfigurationClassPostProcessor 核心逻辑

Java
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    // 1. 解析 @Configuration 类
    // 2. 处理 @ComponentScan
    // 3. 处理 @Import
    // 4. 处理 @ImportResource
    // 5. 处理 @Bean 方法
    // 6. 注册所有 BeanDefinition
}

onRefresh()

Web 容器初始化

Java
// ServletWebServerApplicationContext
protected void onRefresh() {
    super.onRefresh();
    try {
        // 创建 Web 容器
        createWebServer();
    } catch (Throwable ex) {
        throw new ApplicationContextException("Unable to start web server", ex);
    }
}

private void createWebServer() {
    WebServer webServer = null;
    ServletWebServerFactory factory = getWebServerFactory();
    webServer = factory.getWebServer(getSelfInitializer());
    this.webServer = webServer;
    // 启动容器(在 finishRefresh 中)
}

finishBeanFactoryInitialization()

完成非延迟 Bean 初始化

Java
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    // 初始化 ConversionService
    if (!beanFactory.hasConversionService()) {
        beanFactory.setConversionService(createConversionService());
    }

    // 冻结所有 Bean 定义(不允许修改)
    beanFactory.freezeConfiguration();

    // 初始化所有非延迟加载的单例 Bean
    beanFactory.preInstantiateSingletons();
}

preInstantiateSingletons()

Java
public void preInstantiateSingletons() throws BeansException {
    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            if (isFactoryBean(beanName)) {
                // 处理 FactoryBean
            } else {
                // 获取 Bean(触发创建)
                getBean(beanName);
            }
        }
    }
}

finishRefresh()

刷新完成处理

Java
protected void finishRefresh() {
    // 清除资源缓存
    clearResourceCaches();

    // 初始化生命周期处理器
    initLifecycleProcessor();

    // 发布 ContextRefreshedEvent
    publishEvent(new ContextRefreshedEvent(this));

    // 启动 Web 容器
    LiveBeansView.registerApplicationContext(this);
}

注意:refresh() 方法是 Spring 容器的核心,理解每个步骤对排查启动问题至关重要。

要点总结

  • ApplicationContext 根据应用类型自动选择
  • refresh() 包含 12 个核心步骤
  • ConfigurationClassPostProcessor 处理配置类
  • onRefresh() 创建 Web 容器
  • finishRefresh() 触发容器启动

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring Boot自定义注解与AOP结合
下一篇 → Bean 定义加载与注册
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库