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

本文深入探讨了Spring框架中IOC容器初始化时,如何读取XML配置文件并转化为DOM对象的过程。通过分析EntityResolver接口、策略模式的应用以及委派模式在解析和注册bean中的作用,揭示了Spring处理资源文件的灵活性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

涉及的相关类的解释

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);
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值