spring 源码总结2之BeanDefinitionReader

本文深入探讨了Spring框架中的BeanDefinitionReader,它是用于读取BeanDefinition并将其放入Spring容器的关键接口。文章详细介绍了AbstractBeanDefinitionReader、XmlBeanDefinitionReader、PropertiesBeanDefinitionReader和GroovyBeanDefinitionReader的实现细节,包括它们的构造方法和loadBeanDefinitions方法的实现。此外,还提到了AnnotatedBeanDefinitionReader,它是通过注解加载BeanDefinition的方式。
摘要由CSDN通过智能技术生成

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方法,但各个方法都没有具体的实现,只是相

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值