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)
在这里插入图片描述

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