【Spring源码解析】 IOC 初始化流程分析

news/2024/7/6 10:32:18

1 .AbstractApplicationContext prepareBeanFactory

@Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            //刷新前预处理
            prepareRefresh();

            //获取beanFactory实例。(DefaultListableBeanFactory)
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            //beanFactory属性赋值
            prepareBeanFactory(beanFactory);

            try {
                // 子类通过重写这个方法在BeanFactory创建并预准备完成以后做进一步设置
                postProcessBeanFactory(beanFactory);

                // 调用实现BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor 接口的类相关方法
                invokeBeanFactoryPostProcessors(beanFactory);
               
                // 注册实现了BeanPostProcessor接口的Bean
                registerBeanPostProcessors(beanFactory);

                // 标签国际化资源,初始化MessageSource组件
                initMessageSource();
  
                // 创建事件广播器
                initApplicationEventMulticaster();
  
                // 空方法,留给子容器实现,在容器刷新的时候可以子定义逻辑    
                onRefresh();
  
               // 注册监听器事件
                registerListeners();
 
               // 单例模式bean的注册
                finishBeanFactoryInitialization(beanFactory);

                // 刷新完成容器
                finishRefresh();
            }
            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }
                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();
                // Reset 'active' flag.
                cancelRefresh(ex);
                // Propagate exception to caller.
                throw ex;
            }
            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }     

2 核心方法解析

2.1 obtainFreshBeanFactory() 获取BeanFactory

(1) AbstractApplicationContext obtainFreshBeanFactory

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
   //刷新容器
   refreshBeanFactory();
   //获取GenericApplicationContext创建的容器
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
   if (logger.isDebugEnabled()) {
      logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
   }
   return beanFactory;
}

GenericApplicationContext refreshBeanFactory()
在这里插入图片描述
在这里插入图片描述

2.2 invokeBeanFactoryPostProcessors(beanFactory)

实际调用PostProcessorRegistrationDelegate invokeBeanFactoryPostProcessors
(1) 调用实现BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry,postProcessBeanFactory方法
(2) 调用实现类BeanFactoryPostProcessor接口的postProcessBeanFactory方法
 PS:BeanFactoryPostProcessor源码机票  -------> https://blog.csdn.net/qq_34125999/article/details/104645988

2.3 registerBeanPostProcessors(beanFactory);

实际调用PostProcessorRegistrationDelegate  registerBeanPostProcessors,其作用就是给工厂中添加实现了BeanPostProcessor接口的bean
PS:源码机票  ------->  https://blog.csdn.net/qq_34125999/article/details/104572875

2.4 finishBeanFactoryInitialization(beanFactory);

完成单实例Bean的注册。
PS:源码机票  ------->  https://blog.csdn.net/qq_34125999/article/details/104547157

3 单例Bean注册的位置

在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/4556831.html

相关文章

c.k.沉珂 的所有资料

证明你是光明与正义的化身啊 是个双性恋 跟男生是谈精神上的恋爱 和女性的有肉体上的交缠(她日记里写的)她很爱她的爸爸妈妈 不想被遗忘 不想被伤害 有玩血和自残的习惯 经常用刀子把自己划的遍体鳞伤 用很多针管抽自己的血 每天都会一个人哭泣 她精神上特别痛苦 曾经一次性打过…

怎样实现 C 盘的数据还在 我想增大C盘 我不想再装系统了

用PMagic把C盘大小改一下就行了 数据不会丢失

【SpringMVC源码解析】 ServletContainerInitializer SpringMVC源码入口解析

1 ServletContainerInitializer 在web容器启动时为提供给第三方组件机会做一些初始化的工作,servlet规范(JSR356)中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名…

CountDownLatch 源码讲解

CountDownLatch 源码讲解老规矩,先翻译源码。 CountDownLatch 是一种同步辅助工具,允许一个或多个线程等待其他线程中正在执行的一组操作完成。 CountDownLatch是用给定的count参数初始化实例。 await方法会一直阻塞到当前计数为零,当调用c…

高手进 C语言该怎么学起才是最好啊

因为C语言最简单 C语言足够低级 就不要涉足计算机领域 除了“指针” 非常非常地贴近计算机的底层结构 但也许并不需要“面向对象”、“模板”、“函数重载”等等一大堆概念 不必思考应该学什么 而“指针” C语言没有真正意义上的难点 不会让你迷失在概念的汪洋大海 如果你对操作…

C++STL模板库适配器之优先级队列

目录 适配器之优先级队列一丶优先级队列简介(priority_queue)二丶优先级队列代码演示1.优先级队列代码以及使用简介适配器之优先级队列 一丶优先级队列简介(priority_queue) 优先级队列.不采用严格的先进先出的顺序.而是按照优先级. 给定某一时刻位于队列头的元素. 如果两个元素…

【SpringCloud】【Hoxton】基础环境准备

01 基础环境准备 02 一文读懂Eureka 03 Zookeeper注册中心 04 Consule注册中心 05 Ribbon 06 OpenFegin 07 Hystrix全面解析 08 Gateway全面解析 09 Config配置中心 10 Bus消息总线 1 引言 记2020年3月8日 SpringCloud 最新版为Hoxton SR3。 2 创建父工程 (1) spring-cloud…

Semaphore 源码分析

Semaphore 源码分析其实Semaphore源码上的注释就说的比较清楚作用是如何的,下面是从源码翻译过来的解释:计数信号灯。从概念上讲,信号量维护一组许可证。如果需要,acquire方法就是直到获得许可才会继续执行(阻塞&#…