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)