1.beans核心类
1.DefaultListableBeanFactory xmlBeanFactory
xmlBeanFactory继承自DefaultListableBeanFactory,DefaultListableBeanFactory是整个bean加载的核心,是spring注册与加载bean的默认实现,
而对于XmlBeanFactory与DefaultListableBeanFactory不同在于XmlBeanFactory有自定义的xml读取器xmlBeanDefinitionReader。实现了个性化的BeanDefinitionReader
在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册。
2.XmlBeanDefinitonReader
xml配置文件的读取
3.xmlBeanFactory
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
1.创建xmlBeanFactory
a)public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}

b)public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
return loadBeanDefinitions(new EncodedResource(resource));
}

c)public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {

InputStream inputStream = encodedResource.getResource().getInputStream();
try {
InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding());
}
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
}
finally {
inputStream.close();
}
}

d) protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
throws BeanDefinitionStoreException {
//获取对xml文件的验证模式
int validationMode = getValidationModeForResource(resource);
//加载xml文件,并得到对应的Documnet
Document doc = this.documentLoader.loadDocument(
inputSource, this.entityResolver, this.errorHandler, validationMode, this.namespaceAware);
//根据返回的Documnet注册Bean信息
return registerBeanDefinitions(doc, resource);

}
d1) private int getValidationModeForResource(Resource resource) {
return (this.validationMode != VALIDATION_AUTO ? this.validationMode : detectValidationMode(resource));
}
d2)InputStream inputStream;
inputStream = resource.getInputStream();
return this.validationModeDetector.detectValidationMode(inputStream);
d3)public int detectValidationMode(InputStream inputStream) throws IOException {
// Peek into the file to look for DOCTYPE.
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
boolean isDtdValidated = false;
String content;
while ((content = reader.readLine()) != null) {
content = consumeCommentTokens(content);
if (inComment || !StringUtils.hasText(content)) {
continue;
}
// private boolean hasDoctype(String content) {
//return content.indexOf(DOCTYPE) > -1;
//}
if (hasDoctype(content)) {
isDtdValidated = true;
break;
}
else if (hasOpeningTag(content)) {
// End of meaningful data
break;
}
}
return (isDtdValidated ? VALIDATION_DTD : VALIDATION_XSD);
}
finally {
reader.close();
}
}

2.DTD与XSD区别
DTD是xml文件的验证机制,属于xml文件的一部分。
XSD本身是xml文档,可以用指定的XSD来验证某个xml文档

EntityResolver:

最新文章

  1. LeetCode----Tree
  2. UIImageView异步加载网络图片
  3. jsonp 调用天气API
  4. 【Mongodb】---基本命令
  5. zedboard启动过程分析
  6. SSIS 学习(6):包配置(上)【转】
  7. [0] (VDP)垂直开发模式
  8. vue轮播组件及去掉路由#
  9. Android学习之Animation(二)
  10. mysql 重置密码
  11. linux下ifconfig命令看不到IP centos7——ens33
  12. 十四、怎么获取data-id中的值
  13. JavaScript 变量作用域 详解
  14. js 鼠标拖拽元素
  15. 安装IIS
  16. 合并ts到mp4
  17. 主成分分析(PCA)原理及推导
  18. python中的模块及包及软件目录结构规范
  19. Zookeeper初见
  20. 【C】——回调函数实现泛型算法

热门文章

  1. [NOIp2018] luogu P5020 货币系统
  2. oracle初级系列教程
  3. Python eval() exec()
  4. 6. SSH远程管理服务实战
  5. LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统
  6. Spark执行流程(转)
  7. bootstrap网格系统.html
  8. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(下)
  9. 深度学习框架Tensorflow应用(Google工程师)
  10. Nginx、WSGI、 uWSGI、 uwsgi的区别