Spring框架源码解析 IOC容器实现DocumentLoader(二)

电脑里光有仓老师还是不行的,你必须需要播放器,这样才能欣赏苍老师的曼妙身姿偷笑偷笑,Spring兄则是通过DocumentLoader来加载D:\canglaoshi.xml的。

public interface DocumentLoader {
	
	/**
	 * 提供了一个接口,让我们访问苍老师,InputSource,EntityResolver,ErrorHandler都是jdk自带解析xml的
	 */
	Document loadDocument(
			InputSource inputSource, EntityResolver entityResolver,
			ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception ;
}

上面四个参数都是什么意思呢?ErrorHandler,是设置出错了怎么办,比如你惹妹子生气了,你要怎么挽回,最合理的方式是知道妹子为啥生你气,然后在采取相应的行动。validationMode 这个是验证元素的属性是否正确,比如妹子脸上长胡子肯定不合理吧,namespaceAware,设置命名空间,保证元素不冲突,在中国,女生叫小花的人海了去了,但是你如果说某某地方的小花就能确定小花是哪个妹子。

<!DOCTYPE contacts SYSTEM "contacts.dtd">

<contacts xsi:schemaLocation="小花验证.xsd" 
  xmlns:xsi="http://中国深圳市某某中学某某班"> 
  <小花 脸="不长胡子"> 
    
  </小花> 
</contacts>


Spring兄还是非常不错的,它提供了一个默认的实现去加载D:\canglaoshi.xml,这个实现直接使用jdk中解析xml的类库,如果你觉得jdk的实现很low,你可以自己去实现读取xml的方法。

public class DefaultDocumentLoader implements DocumentLoader {
	
	/**
	 * JAXP attribute used to configure the schema language for validation.
	 */
	private static final String SCHEMA_LANGUAGE_ATTRIBUTE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

	/**
	 * JAXP attribute value indicating the XSD schema language.
	 */
	private static final String XSD_SCHEMA_LANGUAGE = "http://www.w3.org/2001/XMLSchema";
	
	@Override
	public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler,
			int validationMode, boolean namespaceAware) throws Exception {
		DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);
		DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
		// 解析资源,返回Document
		return builder.parse(inputSource);
	}
	
	/**
	 * DocumentBuilderFactory创建 DOM解析器的工厂,不能直接实例化,必须通过newInstance方法实例化
	 *
	 */
	protected DocumentBuilderFactory createDocumentBuilderFactory(int validationMode, boolean namespaceAware)
			throws ParserConfigurationException {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 开启命名空间
		factory.setNamespaceAware(namespaceAware);
		
		if (validationMode != XmlValidationModeDetector.VALIDATION_NONE) {
			factory.setValidating(true);
			if (validationMode == XmlValidationModeDetector.VALIDATION_XSD) {
				// Enforce namespace aware for XSD...
				factory.setNamespaceAware(true);
				try {
					//设置验证的SCHEMA方式为XSD
					factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE);
				}
				catch (IllegalArgumentException ex) {
					ParserConfigurationException pcex = new ParserConfigurationException(
							"Unable to validate using XSD: Your JAXP provider [" + factory +
							"] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? " +
							"Upgrade to Apache Xerces (or Java 1.5) for full XSD support.");
					pcex.initCause(ex);
					throw pcex;
				}
			}
		}

		return factory;
	}
	/**
	 * DocumentBuilder可以用来解析xml文件
	 * 
	 */
	protected DocumentBuilder createDocumentBuilder(
			DocumentBuilderFactory factory, EntityResolver entityResolver, ErrorHandler errorHandler)
			throws ParserConfigurationException {

		DocumentBuilder docBuilder = factory.newDocumentBuilder();
		if (entityResolver != null) {
			docBuilder.setEntityResolver(entityResolver);
		}
		if (errorHandler != null) {
			docBuilder.setErrorHandler(errorHandler);
		}
		return docBuilder;
	}
感觉好简单啊,大家不了解的直接请教一下百度咯



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值