1.BeanDefinitionReader
BeanDefinitionReader定义了一个读取BeanDefinition的接口,用于读取配置产生BeanDefinition,结合BeanDefinitionRegistry将对应的BeanDefinition放入spring容器中。其接口定义如下:
/**
* bean定义读取器的简单接口 使用资源和字符串位置参数指定加载方法
* 具体的bean定义读取器当然可以为bean定义添加额外的load和register方法,具体到bean定义格式
* 请注意,bean定义读取器不必实现此接口,它只为希望遵循标准命名约定的bean定义读者提供建议
* @author Juergen Hoeller
* @since 1.1
* @see org.springframework.core.io.Resource
*/
public interface BeanDefinitionReader {
/**
* 获取BeanDefinitionRegistry(bean定义注册器)
*/
BeanDefinitionRegistry getRegistry();
/**
* 获取资源加载器
*/
@Nullable
ResourceLoader getResourceLoader();
/**
* 获取Bean的类加载器
*/
@Nullable
ClassLoader getBeanClassLoader();
/**
* 获取BeanName生成器,为匿名bean生成一个名字
*/
BeanNameGenerator getBeanNameGenerator();
/**
* 加载 BeanDefiniton
*/
int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;
int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;
int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;
}
其实现类下面几个
2.BeanDefinitionReader的几个实现
AbstractBeanDefinitionReader,XmlBeanDefinitionReader,PropertiesBeanDefinitionReader,GroovyBeanDefinitionReader
其中AbstractBeanDefinitionReader是对BeanDefinitionReader的一个抽象实现,其他几个具体实现都是继承AbstractBeanDefinitionReader并再其基础上进行实现的
2.1 AbstractBeanDefinitionReader
AbstractBeanDefinitionReader的构造方法,指定传入一个BeanDefinitionRegistry,并根据该BeanDefinitionRegistry初始化相关信息,该方法不能直接调用(因为是抽象类),只能由子类初始化时调用。
/**
* 构造方法 初始化时需传入BeanDefinitionRegistry
*/
protected AbstractBeanDefinitionReader(BeanDefinitionRegistry registry) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
this.registry = registry; //赋值
//初始化resourceLoader
if (this.registry instanceof ResourceLoader) {
this.resourceLoader = (ResourceLoader) this.registry;
}
else {
this.resourceLoader = new PathMatchingResourcePatternResolver();
}
//初始化environment
if (this.registry instanceof EnvironmentCapable) {
this.environment = ((EnvironmentCapable) this.registry).getEnvironment();
}
else {
this.environment = new StandardEnvironment();
}
}
AbstractBeanDefinitionReader中的loadBeanDefinitions方法实现,这里实现了BeanDefinitionReader中的部分loadBeanDefinitions方法,也多重载了一个loadBeanDefinitions方法,但各个方法都没有具体的实现,只是相