• 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 实例返回。

    在这里插入图片描述

  • 相关阅读:
    6、epoll多路IO
    【C#】解析和操作HTML文档,并进行同级或跨级匹配元素
    Lammps实现纳米孔道内瓦斯驱替过程(包含In文件)
    【密码学】第二章 密码学的基本概念
    达梦数据库运维手册-个人笔记
    恶劣天气 3D 目标检测数据集收集
    【QT】Ubuntu 搭建 QT 环境(图形化界面安装)
    单片机C语言实例:5、数码管闪烁
    bootStrap的布局容器和网格系统
    MySQL优化策略
  • 原文地址:https://blog.csdn.net/qq_36602071/article/details/127680340