Spring源码阅读:BeanDefinitionRegistry接口
BeanDefinitionRegistry 是一个接口,从名字上就可以看出来,它是一个管理 BeanDefinition 的注册中心。通常情况下,BeanFactory 的具体实现类也会实现该接口,用于管理 AbstractBeanDefinition 继承结构下的 BeanDefinition 实例,例如 RootBeanDefinition 和 ChildBeanDefinition 实例。
BeanDefinitionRegistry 的结构
BeanDefinitionRegistry 是一个接口,它实现了 AliasRegistry 接口。其继承结构如下:
AliasRegistry
AliasRegistry 是一个用于管理别名的通用接口,也是 BeanDefinitionRegistry 的父接口。它的定义如下:
1 | public interface AliasRegistry { |
包含的功能有:注册别名、移除别名、判断别名是否已注册过、获取指定名字的所有别名
SimpleAliasRegistry 是该接口的一个简单实现,它内部持有了一个 HashMap,用于保存别名映射关系
1 | // key: 别名 value: 原始名 |
BeanDefinitionRegistry 的方法
BeanDefinitionRegistry 的方法定义了如何对 BeanDefinition 进行管理。SimpleBeanDefinitionRegistry 是 BeanDefinitionRegistry 的一个简单实现,可通过它来了解下具体实现。
SimpleBeanDefinitionRegistry 内部持有了一个 HashMap,用于保存注册的 BeanDefinition,它的所有方法都是基于该 HashMap 进行操作。
1 | // key: beanName value: 对应的 beanDefinition |
registerBeanDefinition
用于注册一个 BeanDefinition
1 | void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) |
SimpleBeanDefinitionRegistry 中的实现:将 beanName 到 beanDefinition 的映射关系保存到 beanDefinitionMap 中
1 | public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) |
removeBeanDefinition
用于移除一个 BeanDefinition
SimpleBeanDefinitionRegistry 中的实现:从 beanDefinitionMap 将指定的 beanName 移除
1 | public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException { |
getBeanDefinition
用于获取一个 BeanDefinition
containsBeanDefinition
判断一个 beanDefinition 是否已注册过
getBeanDefinitionNames
获取已注册的所有 beanDefinition 的名字
getBeanDefinitionCount
获取已注册的 BeanDefinition 数量
isBeanNameInUse
判断一个 beanName 是否已使用
SimpleBeanDefinitionRegistry 中的实现:判断是否为别名,或者已经注册到 BeanDefinitionRegistry 中
1 | public boolean isBeanNameInUse(String beanName) { |
DefaultListableBeanFactory 中的实现
DefaultListableBeanFactory 是一个基本功能的 BeanFactory,它实现了 BeanDefinitionRegistry 接口。它的继承结构如下:
DefaultListableBeanFactory 也是通过一个 HashMap 来管理 BeanDefinition 的,它比 SimpleBeanDefinitionRegistry 多了一些其他的数据存储,使用上也更复杂
1 | // 用于保存 BeanDefinition |
registerBeanDefinition
往 BeanFactory 中注册 BeanDefinition
1 | public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) |
removeBeanDefinition
从 BeanFactory 中移除 BeanDefinition
1 | public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException { |
containsBeanDefinition
1 | public boolean containsBeanDefinition(String beanName) { |
getBeanDefinitionCount
1 | public int getBeanDefinitionCount() { |
getBeanDefinitionNames
1 | public String[] getBeanDefinitionNames() { |
- 2020-01-17
前面说到 BeanDefinitionRegistry 是用来管理 BeanDefinition 的注册中心,但是还没看到 BeanDefinition 长什么样,下面就来了解下。
- 2020-01-22
XmlBeanFactory 可以说是 Spring 中一个最简单的 BeanFactory,通过它可以了解 Spring 的设计思路。
- 2020-01-19
BeanDefinition 用来描述 spring bean,是一个接口,它的具体实现类主要有 RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition 等,分别适用于不同的场景。
- 2020-04-10
XmlBeanFactory
是一个最简单的BeanFactory
实现,它支持通过 xml 的形式配置和管理 bean。本文主要关注其解析xml
和加载BeanDefinition
的流程。 - 2020-04-18
在 dubbo的Reference注解实现原理 中提到,
@Reference
注解用于实现 RPC client 代理的自动注入,这是通过ReferenceAnnotationBeanPostProcessor
来实现的。若要让其生效,还需要在这之前将其注册到 BeanFactory 中。