最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring配置文件解析之BeanDefinitionReader詳解

 更新時(shí)間:2024年02月14日 08:35:49   作者:軍偉@  
這篇文章主要介紹了Spring配置文件解析之BeanDefinitionReader詳解,ApplicationContext.xml配置文件解析成Document對(duì)象,真正對(duì)xml中元素解析的類是在BeanDefinitionDocumentReader的實(shí)現(xiàn)類中來(lái)完成的,需要的朋友可以參考下

BeanDefinitionReader

Spring配置文件的解析是通過(guò)BeanDefinitionReader來(lái)實(shí)現(xiàn)的,其實(shí)了解BeanDefinitionReader實(shí)現(xiàn)的機(jī)制就會(huì)發(fā)現(xiàn),其只是將ApplicationContext.xml配置文件解析成Document對(duì)象,真正對(duì)xml中元素解析的類是在BeanDefinitionDocumentReader的實(shí)現(xiàn)類中來(lái)完成的,接下來(lái)我們也會(huì)對(duì)它進(jìn)行介紹。

對(duì)ApplicationContext.xml中開(kāi)始解析的方法是loadBeanDefinitions

AbstractBeanDefinitionReader的loadBeanDefinitions中會(huì)對(duì)ApplicationContext.xml進(jìn)行解析

@Override
	public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
		Assert.notNull(locations, "Location array must not be null");
		int counter = 0;
		for (String location : locations) {
			counter += loadBeanDefinitions(location);
		}
		return counter;
	}
@Override
	public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {
		return loadBeanDefinitions(location, null);
	}

loadBeanDefinitions中會(huì)根據(jù)文件地址來(lái)進(jìn)行解析操作:

public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException {
		//判斷資源地址類型
		if (resourceLoader instanceof ResourcePatternResolver) {
			// Resource pattern matching available.
			try {
				Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
				//在子類的loadBeanDefinitions進(jìn)行解析操作
				int loadCount = loadBeanDefinitions(resources);
				if (actualResources != null) {
					for (Resource resource : resources) {
						actualResources.add(resource);
					}
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Loaded " + loadCount + " bean definitions from location pattern [" + location + "]");
				}
				return loadCount;
			}
			catch (IOException ex) {
				throw new BeanDefinitionStoreException(
						"Could not resolve bean definition resource pattern [" + location + "]", ex);
			}
		}
		else {
			// Can only load single resources by absolute URL.
			Resource resource = resourceLoader.getResource(location);
			//在子類的loadBeanDefinitions進(jìn)行解析操作
			int loadCount = loadBeanDefinitions(resource);
			if (actualResources != null) {
				actualResources.add(resource);
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Loaded " + loadCount + " bean definitions from location [" + location + "]");
			}
			return loadCount;
		}
	}

loadBeanDefinitions是在子類XmlBeanDefinitionReader中實(shí)現(xiàn)

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

doLoadBeanDefinitions會(huì)將文件地址解析為數(shù)據(jù)流,然后解析數(shù)據(jù)流

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
		
		..........
		
		try {
			//從xml文件中獲取流
			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();
			}
		}
		.......
	}

doLoadBeanDefinitions中會(huì)將文件流解析成Document對(duì)象

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {
		try {
			Document doc = doLoadDocument(inputSource, resource);
			return registerBeanDefinitions(doc, resource);
		}
		.....
	}

registerBeanDefinitions中會(huì)創(chuàng)建BeanDefinitionDocumentReader來(lái)對(duì)Document進(jìn)行解析,對(duì)Spring配置文件中的元素進(jìn)行解析處理。

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
		//創(chuàng)建Document解析處理器
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		int countBefore = getRegistry().getBeanDefinitionCount();
		//在BeanDefinitionDocumentReader中解析xml中配置的元素
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getRegistry().getBeanDefinitionCount() - countBefore;
	}

總結(jié)

簡(jiǎn)單來(lái)說(shuō)BeanDefinitionReader所做的處理操作是將配置的ApplicationContext.xml解析成為Document對(duì)象,接下來(lái)會(huì)有 BeanDefinitionDocumentReader來(lái)對(duì)Document進(jìn)行解析。

到此這篇關(guān)于Spring配置文件解析之BeanDefinitionReader詳解的文章就介紹到這了,更多相關(guān)Spring的BeanDefinitionReader內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

乌鲁木齐县| 龙江县| 英山县| 广平县| 泰宁县| 郑州市| 屯昌县| 绥江县| 县级市| 武鸣县| 嘉义县| 平陆县| 七台河市| 吕梁市| 根河市| 古丈县| 甘德县| 娄烦县| 甘洛县| 长沙县| 淮南市| 贡嘎县| 图木舒克市| 江都市| 夹江县| 阿图什市| 将乐县| 永顺县| 河池市| 承德县| 五河县| 浠水县| 涿州市| 红安县| 东宁县| 庆安县| 九龙坡区| 大邑县| 南郑县| 拉萨市| 祥云县|