Spring源碼分析 加載資源並資源裝配對象

Spring源碼分析 加載資源並資源裝配對象


XmlBeanFactory 源碼如下

資源載入

public class XmlBeanFactory extends DefaultListableBeanFactory {

	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, null);
	}

	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory)
			throws BeansException {
		super(parentBeanFactory);
		reader = new XmlBeanDefinitionReader(this);
		reader.loadBeanDefinitions(resource);
	}

	private final XmlBeanDefinitionReader reader;
}


public class ClassPathResource extends AbstractFileResolvingResource {
public ClassPathResource(String path) {
	this(path, (ClassLoader) null);
}

public ClassPathResource(String path, ClassLoader classLoader) {
	Assert.notNull(path, "Path must not be null");
	String pathToUse = StringUtils.cleanPath(path);
	if (pathToUse.startsWith("/"))
		pathToUse = pathToUse.substring(1);
	this.path = pathToUse;
	this.classLoader = classLoader == null ? ClassUtils
			.getDefaultClassLoader() : classLoader;
}

public ClassPathResource(String path, Class clazz) {
	Assert.notNull(path, "Path must not be null");
	this.path = StringUtils.cleanPath(path);
	this.clazz = clazz;
}

源碼分析
XmlBeanFactory 解析工廠繼承父類DefaultListableBeanFactory
解析方式如下
XmlBeanFactory factory=new XmlBeanFactory (new ClassPathResource(beans.xml))
Zachary zachary=(Zachary)factory.getBean(“zachary”);

ClassPathResource通過ClassLoader加載文件並解析,

DefaultListableBeanFactory 用於擴展直接解析獲取屬性文件,解析方式如下
ClassPathResource resource=new ClassPathResource(“beans.xml”);
DefaultListableBeanFactory factory=new DefaultListableBeanFactory ();
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinition(resource);

Spring加載資源 並 資源裝配對象的過程

  • 定義好Spring的配置文件
  • 通過Resource對象將Spring配置文件進行抽象,抽象成一個Resource對象
  • 定義bean工廠(如多beanFactory)
  • 定義好XmlBeanDefinitionReader對象,並將工廠作爲參數傳遞去供用後續回調使用
  • 通過XmlBeanDefinitionReader對象讀取之前抽象出的Resource對象(包含XML文件解析過程)
  • IOC容器創建完畢,用戶可以通過容器獲取對象信息

作者簡介:張程 技術研究

更多文章請關注微信公衆號:zachary分解獅 (frankly0423)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章