Spring IOC源码解析(一)---读取Xml文件生成Dom对象

涉及的相关类的解释

EntityResolver
EntityResolver学过设计模式的看到这个图应该会联想到某些设计模式,其实就是委派模式

委派模式中的3个参与角色:

  • EntityResolver抽象任务角色
  • DelegateEntityResolver委派者角色,负责决策,调用哪个具体任务角色的方法
  • BeansDtdResolverPluggableSchemaResolver具体任务角色,真正用于执行任务的角色

抽象接口
resolveEntity有2个参数,publicIdsystemId

public interface EntityResolver {
   
    public abstract InputSource resolveEntity (String publicId,
                                               String systemId)
        throws SAXException, IOException;
}

对于XSD头部而言

  • publicId = null
  • systemId = http://www.springframework.org/schema/beans/spring-beans.xsd
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

对于DTD头部声明而言

  • publicId = -//SPRING//DTD BEAN//EN
  • systemId = http://www.springframework.org/dtd/spring-beans.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

DelegatingEntityResolver

public class DelegatingEntityResolver implements EntityResolver {
   

	/** Suffix for DTD files. */
	public static final String DTD_SUFFIX = ".dtd";
	/** Suffix for schema definition files. */
	public static final String XSD_SUFFIX = ".xsd";
	
	//具体任务角色
	private final EntityResolver dtdResolver;
	private final EntityResolver schemaResolver;

	//采用默认的解析器
	public DelegatingEntityResolver(@Nullable ClassLoader classLoader) {
   
		this.dtdResolver = new BeansDtdResolver();
		this.schemaResolver = new PluggableSchemaResolver(classLoader);
	}
	//自定义解析器
	public DelegatingEntityResolver(EntityResolver dtdResolver, EntityResolver schemaResolver) {
   
		Assert.notNull(dtdResolver, "'dtdResolver' is required");
		Assert.notNull(schemaResolver, "'schemaResolver' is required");
		this.dtdResolver = dtdResolver;
		this.schemaResolver = schemaResolver;
	}

	//决策使用哪个解析器进行解析
	@Override
	@Nullable
	public InputSource resolveEntity(@Nullable String publicId, @Nullable String systemId)
			throws SAXException, IOException {
   

		if (systemId != null) {
   
			if (systemId.endsWith(DTD_SUFFIX)) {
   
				return this.dtdResolver.resolveEntity(publicId, systemId);
			}
			else if (systemId.endsWith(XSD_SUFFIX)) {
   
				return this.schemaResolver.resolveEntity(publicId, systemId);
			}
		}
		return null;
	}
}

需求及划分

总体需求一:对各种各样的资源文件进行读取、验证,并返回资源文件的document实例

需求划分一:BeanFactory初始化过程

XmlBeanFactory继承关系图

此处使用构造器重载给父工厂赋值了个null,是为了什么?
其实就是为了实现:若不传父工厂参数则默认为null,不需玩家手动填null

	public XmlBeanFactory(Resource resource) throws BeansException {
   
		this(resource, null);
	}
	public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值