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)