• Spring(五)- Bean 实例化的基本流程


    一、Bean 实例化的基本流程

    Spring容器在进行初始化时,会将 xml 配置的 < bean>的信息封装成一个 BeanDefinition 对象,所有的 BeanDefinition 存储到一个名为 beanDefinitionMap 的 Map 集合中去, Spring 框架再对该 Map 进行遍历,使用反射创建 Bean 实例对象,创建好的 Bean 对象存储在一个名为 singletonObjects 的 Map 集合中,当调用 getBean 方法时则最终从该 Map 集合中取出 Bean 实例对象返回。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    BeanFactory默认的实现类是DefaultListableBeanFactory
    在这里插入图片描述

    DefaultListableBeanFactory对象内部维护着一个 beanDefinitionMap 用于存储封装好的 BeanDefinition,源码如下:

    public class DefaultListableBeanFactory extends ... implements ...{
    	// 存储 < bean> 标签对应的 BeanDefinition 对象
    	// key:是Bean的 beanName,value:是Bean定义对象BeanDefinition
    	private final Map<String, BeanDefinition> beanDefinitionMap;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Spring框架会取出 beanDefinitionMap 中的每个 BeanDefinition 信息,反射构造方法或调用指定的工厂方法生成 Bean 实例对象,所以只要将 BeanDefinition 注册到 beanDefinitionMap 这个 Map 中, Spring 就会进行对应的 Bean 的实例化操作

    Bean实例及单例池 singletonObjects,beanDefinitionMap 中的 BeanDefinition 会被转化成对应的 Bean 实例对象,存储到单例池 singletonObjects 中去,在 DefaultListableBeanFactory 的上四级父类 DefaultSingletonBeanRegistry 中,维护着 singletonObjects ,源码如下:

    public class DefaultSingletonBeanRegistry extends ... implements ...{
    	// 存储 Bean 实例的单例池
    	// key:是Bean的beanName,value:是Bean的实例对象
    	private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    小结:
    1.加载 xml 配置文件,解析获取配置中的每个 < bean>的信息,封装成一个个的 BeanDefinition 对象;
    2.将 BeanDefinition 存储在一个名为 beanDefinitionMap 的 Map< String,BeanDefinition> 中;
    3.ApplicationContext 底层遍历 beanDefinitionMap ,创建 Bean 实例对象;
    4.创建好的 Bean 实例对象,被存储到一个名为 singletonObjects 的 Map< String,Object> 中;
    5.当执行 applicationContext.getBean(beanName)时,从 singletonObjects 去匹配 Bean 实例返回。

    在这里插入图片描述

  • 相关阅读:
    Unity中Shader的深度写入ZWrite
    Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
    “剧情+综艺” 助推国潮文化破圈
    第16章_瑞萨MCU零基础入门系列教程之CAN 协议
    CSV文件新增数据知多少
    C++Prime Plus(6)
    centos7做软连接及注意事项
    Android 12(S) 图像显示系统 - Surface 一点补充知识(十二)
    驱动:驱动相关概念,内核模块编程,内核消息打印printk函数的使用
    elasticsearch配置
  • 原文地址:https://blog.csdn.net/qq_36602071/article/details/127680340