用于将ResourceLoader或ResourcePatternResolver将配置信息解析成一个个的BeanDefinition,通过BeanDefinitionRegistry将BeanDefinition注册到容器。
public interface BeanDefinitionReader {
// 获取BeanDefinitionRegistry对象,主要作用将其注册到BeanDefinition的注册表中
BeanDefinitionRegistry getRegistry();
@Nullable
ResourceLoader getResourceLoader();
@Nullable
ClassLoader getBeanClassLoader();
// Bean名称生成器,为匿名的bean生成一个名字(id)
BeanNameGenerator getBeanNameGenerator();
// 加载单个配置文件
int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;
// 加载多个配置文件
int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;
}
BeanDefinitionReader 的类关系图
加载Resouce主要依赖于 AbstractBeanDefinitionReader 抽象类的 loadBeanDefinitions 方法。
在 XMLBeanDefinitionReader 中,将XML配置文件解析成Document通过 registerBeanDefinitions 方法将这些BeanDefinition加载进容器。
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
// 创建BeanDefinitionDocumentReader,这个实际从XML的DOM树中读取BeanDefinition
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
// 获取注册表beanDefinitionMap在本次加载前的BeanDefinition数量
int countBefore = getRegistry().getBeanDefinitionCount();
// 加载并注册
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
// 本次加载的数量等于现在的数量减去加载前的数量
return getRegistry().getBeanDefinitionCount() - countBefore;
}