Spring源码讲解之 loadBeanDefinitions 方法

loadBeanDefinitions 方法在 org.springframework.context.support.AbstractRefreshableApplicationContext 类中被定义,用来将 bean 定义信息加载到 bean 工厂中,该方法会在 org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory() 方法中被调用,调用该方法需要传递一个 org.springframework.beans.factory.support.DefaultListableBeanFactory 类型的参数,该方法返回值为空,当解析 bean 定义出错是会抛出 org.springframework.beans.BeansException 异常,当加载 bean 配置文件出错时会抛出 java.io.IOException 异常。

源码定义

protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
			throws BeansException, IOException;

loadBeanDefinitions 方法在 org.springframework.context.support.AbstractXmlApplicationContext 中的实现

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
	// 创建一个 xml bean 定义阅读器
	XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

	// 设置 bean 定义阅读器的运行环境
	beanDefinitionReader.setEnvironment(this.getEnvironment());
	beanDefinitionReader.setResourceLoader(this);
	beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

	// 初始化 bean 定义阅读器,子类可以重写该方法进行自定义
	initBeanDefinitionReader(beanDefinitionReader);
	// 加载 bean 定义资源
	loadBeanDefinitions(beanDefinitionReader);
}

initBeanDefinitionReader 方法在 org.springframework.context.support.AbstractXmlApplicationContext 类中的实现

protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
	// 设置是否使用 XML 验证
	// this.validating 的值在该类中默认是 true
	reader.setValidating(this.validating);
}

loadBeanDefinitions 方法在 org.springframework.context.support.AbstractXmlApplicationContext 类中的实现

protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
	// 获取 Resource 类型的配置,默认实现返回 null,子类可以重写该方法进行扩展
	Resource[] configResources = getConfigResources();
	if (configResources != null) {
		// 加载配置文件中的 bean 定义
		reader.loadBeanDefinitions(configResources);
	}
	// 获取 String 形式的配置,默认实现返回 null,子类可以重写该方法进行扩展
	String[] configLocations = getConfigLocations();
	if (configLocations != null) {
		// 加载配置文件中的 bean 定义
		reader.loadBeanDefinitions(configLocations);
	}
}

收工,loadBeanDefinitions 方法源码分析讲解完毕,希望能对你有所帮助。


版权声明:本文为mokey1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。