小明学Spring Framework容器启动系列——Bean定义的注册

本文深入探讨Spring容器如何将Bean定义注册到BeanFactory中,讲解BeanDefinitionRegistry接口及其作用,以及Bean定义的保存方式、注册流程、重写逻辑、并发处理和别名注册等关键点。通过详细分析,帮助读者理解Spring框架内部的Bean管理机制。
摘要由CSDN通过智能技术生成


系列文章——小明学Spring Framework容器启动系列
1. 小明学Spring Framework容器启动系列——Spring Framework容器启动概览 2. 小明学Spring Framework容器启动系列——Bean定义的读取
3. 小明学Spring Framework容器启动系列——Bean定义的解析 4.小明学Spring Framework容器启动系列——Bean名称生成策略
5.小明学Spring Framework容器启动系列——Bean定义的注册 6.小明学Spring Framework容器启动系列——容器PrepareRefresh
7.小明学Spring Framework容器启动系列——BeanFactory的初始化 8.小明学Spring Framework容器启动系列——BeanPostProcessor和BeanFactoryPostProcessor的初始化
9.小明学Spring Framework容器启动系列——国际化与事件的初始化 10.小明学Spring Framework容器启动系列——BeanFactory的初始化完成
11. 小明学Spring Framework容器启动系列——容器启动的收尾工作

1. 前言

1. 前言

Spring容器的构建过程是自动化的,意味着用户写好容器的定义之后,Spring容器可以自动根据用户的定义装配好容器。在我的前几篇博客中,简述了如何读取、解析Spring的xml文件和注解定义,通过以上步骤得到的Spring定义只是一个对象,并没有把这些Bean定义注册到Spring容器中,本文讲简述Spring如何将Bean定义注册到容器中。Bean定义的注册在整个Spring容器启动过程中的位置如图中的红色方框部分所示。
在这里插入图片描述

2. Spring Bean的注册的实现

Spring有专门的Bean注册接口BeanDefinitionRegistry用于向BeanFactory注册Bean的定义,而且所有的BeanFactory都实现了这个接口,意味着所有的BeanFactory都可以使用BeanDefinitionRegistry中的接口向自身注册Bean的定义,BeanDefinitionRegistry接口的定义如下所示:

public interface BeanDefinitionRegistry extends AliasRegistry {
   

	// 向BeanFactory注册Bean定义
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	// 移除BeanFactory中的Bean定义
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 获取BeanFactory中的Bean定义
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 判断BeanFactory是否包含Bean的定义
	boolean containsBeanDefinition(String beanName);

	// 获取BeanFactory中所有Bean的名称
	String[] getBeanDefinitionNames();

	// BeanFactory中包含多少Bean
	int getBeanDefinitionCount();

	// BeanFactory是否包含指定名称或者别称的Bean
	boolean isBeanNameInUse(String beanName);
}

2.1 Bean定义保存的方式

Bean定义会通过BeanDefinitionRegistry注册到BeanFactory中,那么注册到BeanFactory中的Bean定义是如何保存的呢?从如下的DefaultListableBeanFactory源码片段可以看出来,Spring使用一个ConcurrentHashMap保存了注册好的Bean定义,其中Key是Bean的名称,value是Bean的定义。

	/** Map of bean definition objects, keyed by bean name. */
	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-御狐神-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值