Spring-容器refresh


​ 从源码分析了Spring容器的refresh过程,并通过图文的方式记录了整个流程的核心步骤

核心步骤总结

  1. 准备 BeanFactory(包括类加载器、SPEL解析器等基础设施)
  2. 执行 BeanDefinitionRegistryPostProcessor:优先处理配置类等,动态注册更多 BeanDefinition
  3. 执行 BeanFactoryPostProcessor:可用来修改 BeanDefinition 信息
  4. 注册 BeanPostProcessor:用于后续 Bean 创建生命周期中的扩展
  5. 初始化 MessageSource:国际化消息解析支持
  6. 初始化事件广播器(ApplicationEventMulticaster)并注册为 Bean
  7. 调用 onRefresh():留给子类扩展(如创建 Web Server)
  8. 注册 ApplicationListener:用于监听容器事件
  9. 实例化非懒加载的单例 Bean
  10. 完成刷新:启动 SmartLifecycle Bean,发布 ContextRefreshedEvent

spring-context-refresh.png

AbstractApplicationContext#refresh-源码分析

整体的refresh

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // 1. 准备上下文环境(包括设置启动时间、状态标志位、初始化环境属性等)
        prepareRefresh();

        // 2. 创建并刷新 BeanFactory(默认 DefaultListableBeanFactory)
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 3. 对BeanFactory做各种填充
        prepareBeanFactory(beanFactory);

        try {
            // 4. hook方法,供子类在 BeanFactory 初始化后、自定义修改它
            postProcessBeanFactory(beanFactory);

            // 5. 调用 BeanFactoryPostProcessor(BeanDefinitionRegistryPostProcessor >
            // BeanFactoryPostProcessor)
            // ConfigurationClassPostProcessor就是这阶段处理的
            invokeBeanFactoryPostProcessors(beanFactory);

            // 6. 注册 BeanPostProcessor(并非调用),用于后续Bean实例化的hook
            registerBeanPostProcessors(beanFactory);

            // 7. 为上下文初始化Message源,国际化处理
            initMessageSource();

            // 8. 初始化事件广播器(默认实现为SimpleApplicationEventMulticaster,专门用来查找对应ApplicationEvent应该使用哪个ApplicationListener(按类型匹配))
            initApplicationEventMulticaster();

            // 9. 留给子类初始化其他bean(spring boot中子类会初始化web服务器)
            onRefresh();

            // 10. 注册所有实现了 ApplicationListener 的 Bean 到广播器中
            registerListeners();

            // 11. 初始化剩下Bean(非lazy 且 singleton)
            finishBeanFactoryInitialization(beanFactory);

            // 12. SmartLifecycle的Bean可以start了,并且发布ContextRefreshedEvent事件
            finishRefresh();
        }

        catch (BeansException ex) {
            if (logger.isWarnEnabled()) {
                logger.warn("Exception encountered during context initialization - " +
                        "cancelling refresh attempt: " + ex);
            }

            // 异常处理1:销毁已创建的单例 bean,避免资源泄漏
            destroyBeans();

            // 异常处理2:重置 context 状态标志,保证下次调用 refresh 可以重新开始
            cancelRefresh(ex);

            throw ex;
        }

        finally {
            // 最终清除 Spring 内部使用的一些缓存(如反射、泛型元信息等)
            resetCommonCaches();
        }
    }
}

关键步骤分析

prepareBeanFactory

​ 目的是对内部 BeanFactory 进行增强配置,注入 ApplicationContext 级别的基础能力,主要包括如下

  • 设置类加载器、SpEL 表达式解析器与资源编辑器
  • 注册常见 Aware 接口的处理器特殊依赖的自动解析
  • 注册内置基础 Bean(如 Spring Environment、系统属性、系统环境变量
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // 设置类加载器(用于加载 bean 类、AOP 等)
    beanFactory.setBeanClassLoader(getClassLoader());
    // 设置beanFactory的表达式语言(SpEL)处理器
    beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    // 设置各种PropertyEditor(用于解析 Resource 等)
    beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

    // 注册 ApplicationContextAwareProcessor,处理以下几个 Aware 接口注入
    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    // 设置一些忽略自动装配的接口,上面的ApplicationContextAwareProcessor就已经搞定了
    beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

    // 设置几个特殊的依赖注入值(无需在容器中定义,注入时直接解析为指定对象)
    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    beanFactory.registerResolvableDependency(ApplicationContext.class, this);

    // 添加ApplicationListener的监听器,当单例bean初始化后,且实现了ApplicationListener接口,就将其缓存起来以便使用
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

    // 如果容器中有 LoadTimeWeaver,注册对应的 Aware 处理器,并设置临时 ClassLoader
    if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
        beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
        beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }

    // Spring Environment Bean 注册(当前环境信息)
    if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
        beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    }
    // 系统属性(System.getProperties())Bean注册
    if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
        beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    }
    // 系统环境变量(System.getenv())Bean注册
    if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
        beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    }
}

invokeBeanFactoryPostProcessors

  1. 先处理 BeanDefinitionRegistryPostProcessor
    • 手动传入的优先执行
    • 容器中的按 PriorityOrdered > Ordered > 剩下的
    • 若执行过程中有动态注册的后处理器,继续迭代
  2. 再处理 BeanFactoryPostProcessor
    • 优先级一样, PriorityOrdered > Ordered > 剩下的
  3. 最后清除合并后的 BeanDefinition 缓存,确保后处理器修改生效

ConfigurationClassPostProcessor 就是最早执行的 BeanDefinitionRegistryPostProcessor之一,其负责解析 @Configuration 等注解并动态注册大量 BeanDefinition。因此,我们可以通过自定义 BeanDefinitionRegistryPostProcessor 在它之后介入,统一处理或修改所有后续注册的 BeanDefinition,实现排除、添加或调整

// PostProcessorRegistrationDelegate类
public static void invokeBeanFactoryPostProcessors(
        ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

    // 已经处理过了的BeanDefinitionRegistryPostProcessors集和,避免重复处理bean
    Set<String> processedBeans = new HashSet<>();

    /// 判断 beanFactory 是否支持注册
    /// BeanDefinition,以优先处理BeanDefinitionRegistryPostProcessor
    if (beanFactory instanceof BeanDefinitionRegistry) {
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
        List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
        List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

        for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
                registryProcessor.postProcessBeanDefinitionRegistry(registry);
                registryProcessors.add(registryProcessor);
            } else {
                regularPostProcessors.add(postProcessor);
            }
        }

        // 当前阶段要执行的 BeanDefinitionRegistryPostProcessor 处理器列表,处理的优先级:PriorityOrdered >
        // Ordered > 剩下的
        List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

        // =================== 第一轮:处理 PriorityOrdered 的 BD 处理器 ===================
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true,
                false);
        for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
            }
        }
        sortPostProcessors(currentRegistryProcessors, beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();

        // =================== 第二轮:处理 Ordered 的 BD 处理器 ===================
        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
            }
        }
        sortPostProcessors(currentRegistryProcessors, beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();

        // =================== 最后:处理剩余的无序 BD 处理器(可能动态注册) ===================
        boolean reiterate = true;
        while (reiterate) {
            reiterate = false;
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true,
                    false);
            for (String ppName : postProcessorNames) {
                if (!processedBeans.contains(ppName)) {
                    currentRegistryProcessors
                            .add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                    reiterate = true;
                }
            }
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();
        }

        // =================== 执行所有已注册 BD 处理器的 postProcessBeanFactory 回调
        // ===================
        invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
        // =================== 执行用户提供的常规 BeanFactoryPostProcessor ===================
        invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }

    else {
        invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    }

    // =================== 从配置中获取剩余的 BeanFactoryPostProcessor ===================
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

    // 分类收集 PriorityOrdered、Ordered、其他的 三类处理器
    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    for (String ppName : postProcessorNames) {
        if (processedBeans.contains(ppName)) {
            // skip - already processed in first phase above
        } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
        } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
        } else {
            nonOrderedPostProcessorNames.add(ppName);
        }
    }

    // 执行顺序类似上面的BD处理器
    // PriorityOrdered
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

    // Ordered
    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
    for (String postProcessorName : orderedPostProcessorNames) {
        orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    sortPostProcessors(orderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

    // 其他的
    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    for (String postProcessorName : nonOrderedPostProcessorNames) {
        nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    // 清理 BeanDefinition 的缓存,防止元信息过期(如占位符已被替换)
    beanFactory.clearMetadataCache();
}

registerBeanPostProcessors

实例化并注册所有 BeanPostProcessor,按 PriorityOrdered > Ordered > 无序 的优先级添加到容器中,确保 Bean 生命周期中的处理器执行顺序符合预期;内部处理器(MergedBeanDefinitionPostProcessor)统一放在末尾,确保其在所有普通处理器之后执行。

// PostProcessorRegistrationDelegate类
public static void registerBeanPostProcessors(
        ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    // 获取所有实现了 BeanPostProcessor 接口的 beanName(不实例化)
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

    // 记录目标 BeanPostProcessor 总数:现有 + 新注册 + 最终数量
    int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
   /*
     *   专门用来检查普通bean是否走完所有的BeanPostProcessor的
     *
     * 一个普通的bean在实例化时,正常情况下应该走完所有的BeanPostProcessor,
     * 但当只注册了部分的BeanPostProcessor(放到IOC容器中)时,
     * 此时实例化一个bean可能就导致还未注册的BeanPostProcessor处理不了(看优先级),
     * 就会由这个checker来日志提醒(仅打印info日志)
     */
    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

    // 准备分组存储不同优先级的 BeanPostProcessor
    List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    // 分类:根据是否实现 PriorityOrdered / Ordered / 无排序
    for (String ppName : postProcessorNames) {
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { // PriorityOrdered的直接实例化
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            priorityOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
        } else {
            nonOrderedPostProcessorNames.add(ppName);
        }
    }

    // PriorityOrdered以及实例化了,就可直接 排序 ->  注册
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

    // Ordered,实例化 -> 排序 -> 注册
    List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
    for (String ppName : orderedPostProcessorNames) {
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        orderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    sortPostProcessors(orderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, orderedPostProcessors);

    // 无顺序,实例化 -> 注册
    List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    for (String ppName : nonOrderedPostProcessorNames) {
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        nonOrderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

    // 四、最后统一注册 MergedBeanDefinitionPostProcessor(内部BPP),例如:
    // - AutowiredAnnotationBeanPostProcessor
    // - CommonAnnotationBeanPostProcessor
    // - ApplicationListenerDetector 等
    sortPostProcessors(internalPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, internalPostProcessors);

    // 五、重新注册 ApplicationListenerDetector,用来收集ApplicationListener Bean(确保在链末尾执行(避免过早代理))
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

initApplicationEventMulticaster

​ 注册的默认事件广播器为SimpleApplicationEventMulticaster,其主要是对所有的ApplicationEvent事件进行分发匹配到对应的ApplicationListener中支持异步,线程池为SimpleApplicationEventMulticaster.taskExecutor,默认同步分发

protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
        this.applicationEventMulticaster =
                beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        if (logger.isTraceEnabled()) {
            logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    }
    else {
        // 实例化并注册默认的事件广播器Bean:SimpleApplicationEventMulticaster
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
        if (logger.isTraceEnabled()) {
            logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
                    "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
        }
    }
}

onRefresh

​ 一个模板方法(hook),由子类实现,用于在 refresh() 流程中 容器刷新完成、所有 BeanFactory 初始化完毕之后,进行特定上下文的扩展初始化工作。

​ 比如在 Spring Boot 中,AnnotationConfigServletWebServerApplicationContext 会在该方法中创建和启动内嵌的 Web 服务器(默认是 Tomcat,可选 Jetty 或 Undertow),并完成 Web 环境相关的初始化。

finishBeanFactoryInitialization

是 Spring 容器刷新流程中的 核心收尾步骤之一,主要职责如下:

  1. 初始化所有非懒加载(non-lazy)、非抽象的单例 Bean
    • 这一步会触发 Bean 的完整生命周期流程:依赖注入(populate)、初始化方法调用(如 @PostConstructInitializingBean#afterPropertiesSet)、AOP 代理包装等
  2. 触发 SmartInitializingSingleton 回调
    • 所有实现了 SmartInitializingSingleton 接口的单例 Bean,会在 所有非懒加载的单例 Bean 完成初始化之后 统一回调其 afterSingletonsInstantiated() 方法。
    • 这是容器中所有 Bean 都就绪之后的 “最后的hook”,用于执行依赖所有 Bean 的集中初始化逻辑
// AbstractApplicationContext
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {

    // 清空临时类加载器
    beanFactory.setTempClassLoader(null);

    // 冻结BeanDefinition的配置,代表需要的地方可以缓存了
    // 走到这,BeanDefinition都已经处理完毕了,所以可以考虑缓存了
    beanFactory.freezeConfiguration();

    // 实例化所有非lazy加载的单例bean,并在加载完后调用SmartInitializingSingleton接口
    // SmartInitializingSingleton这个接口就是在实例化所有非lazy且单例bean完成后需要调用的
    beanFactory.preInstantiateSingletons();
}

真正初始化单例bean(DefaultListableBeanFactory#preInstantiateSingletons方法)

public void preInstantiateSingletons() throws BeansException {
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        // 非抽象 + 单例 + 非lazy加载
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            // 实例化工厂Bean
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    FactoryBean<?> factory = (FactoryBean<?>) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(
                                (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                                getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                // 实例化非工厂Bean
                getBean(beanName);
            }
        }
    }

    // apply所有SmartInitializingSingleton Bean逻辑
    // 重要的拓展口,可以在这里最早感知到大部分Bean准备完毕,可以放心调用这些bean的各种方法了
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        if (singletonInstance instanceof SmartInitializingSingleton) {
            SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    smartSingleton.afterSingletonsInstantiated();
                    return null;
                }, getAccessControlContext());
            }
            else {
                smartSingleton.afterSingletonsInstantiated();
            }
        }
    }
}

finishRefresh

​ 这一步结束,容器对外就完全可用了

protected void finishRefresh() {
    // 清除上下文级别的缓存资源,例如类扫描过程中缓存的 ASM 元数据。
    clearResourceCaches();

    // 初始化生命周期处理器(LifecycleProcessor)。
    // 默认实现为 DefaultLifecycleProcessor,用于统一管理实现了 Lifecycle 接口的 bean 的启动与停止
    initLifecycleProcessor();

    // 通知生命周期处理器,容器刷新完成
    // 将启动所有实现了 SmartLifecycle 接口并设置了 autoStartup = true 的 Bean(通常用于自动启动的组件,如消息监听容器、调度器等)
    getLifecycleProcessor().onRefresh();

    // 广播容器刷新完成事件:ContextRefreshedEvent
    // 所有实现了 ApplicationListener 接口,监听该事件的 Bean 都会收到通知,可用于执行基于“容器就绪”的后置逻辑。
    publishEvent(new ContextRefreshedEvent(this));

    // 将当前 ApplicationContext 注册到 JMX 的 LiveBeansView 中(如果启用)
    // 这允许通过 JMX 客户端动态查看容器中所有 Bean 的状态(例如 VisualVM 插件)
    LiveBeansView.registerApplicationContext(this);
}