Spring Bean定义的注册
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)