关于源码:SpringBoot源码-bean的加载上

43次阅读

共计 1191 个字符,预计需要花费 3 分钟才能阅读完成。

我又来讲源码恶心大家了,嘿嘿~

上一节中讲的 run() 办法启动流程中,有那么一行代码:

refreshContext(context);

这一行代码就是明天的男主角了 – 它实现了 bean 的加载。它的实现在 AbstractApplicationContext 类的 refresh() 办法中,上码:

@Override
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
    // 容器状态设置、初始化属性设置、验证必备属性
    prepareRefresh();
    // 获取 beanFactory
    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    // 设置 beanFactory 的一些属性、增加后置处理器、注册默认的环境 beans、prepareBeanFactory(beanFactory);
    try {
        // 空办法,给子类留个钩子注入 postProcessors
        postProcessBeanFactory(beanFactory);
        
        StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
        // 执行 BeanFactoryPostProcessor
        invokeBeanFactoryPostProcessors(beanFactory);

        // BeanPostProcessor 注册进容器
        registerBeanPostProcessors(beanFactory);
        beanPostProcess.end();

        // 为容器初始化音讯源
        initMessageSource();

        // 为容器注册事件播送器
        initApplicationEventMulticaster();

        // 空办法,留给子类注册其余 bean
        onRefresh();

        // 注册事件监听器,派发之前未解决的事件
        registerListeners();

        // 初始化剩下的单实例 bean
        finishBeanFactoryInitialization(beanFactory);

        // 初始化什么周期处理器,公布容器启动事件
        finishRefresh();}
        …………
        finally {
            // 清缓存
            resetCommonCaches();
            contextRefresh.end();}
    }
}

以上是 spring 容器启动的外围流程,下一节,重点来了~~

正文完
 0