基於Xml 的IOC 容器-開始讀取配置內容
繼續回到XmlBeanDefinitionReader 的loadBeanDefinitions(Resource …)方法看到代表bean 檔案的資源定義以後的載入過程。
//XmlBeanDefinitionReader載入資源的入口方法
@Override
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
//將讀入的XML資源進行特殊編碼處理
return loadBeanDefinitions(new EncodedResource(resource));
}
//這裡是載入XML形式Bean定義資原始檔方法
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
Assert.notNull(encodedResource, "EncodedResource must not be null");
if (logger.isInfoEnabled()) {
logger.info("Loading XML bean definitions from " + encodedResource.getResource());
}
Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
if (currentResources == null) {
currentResources = new HashSet<>(4);
this.resourcesCurrentlyBeingLoaded.set(currentResources);
}
if (!currentResources.add(encodedResource)) {
throw new BeanDefinitionStoreException(
"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
}
try {
//將資原始檔轉為InputStream的IO流
InputStream inputStream = encodedResource.getResource().getInputStream();
try {
//從InputStream中得到XML的解析源
InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding());
}
//這裡是具體的讀取過程
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
}
finally {
//關閉從Resource中得到的IO流
inputStream.close();
}
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(
"IOException parsing XML document from " + encodedResource.getResource(), ex);
}
finally {
currentResources.remove(encodedResource);
if (currentResources.isEmpty()) {
this.resourcesCurrentlyBeingLoaded.remove();
}
}
}
//從特定XML檔案中實際載入Bean定義資源的方法
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
throws BeanDefinitionStoreException {
try {
//將XML檔案轉換為DOM物件,解析過程由documentLoader實現
Document doc = doLoadDocument(inputSource, resource);
//這裡是啟動對Bean定義解析的詳細過程,該解析過程會用到Spring的Bean配置規則
return registerBeanDefinitions(doc, resource);
}
catch (BeanDefinitionStoreException ex) {
throw ex;
}
catch (SAXParseException ex) {
throw new XmlBeanDefinitionStoreException(resource.getDescription(),
"Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex);
}
catch (SAXException ex) {
throw new XmlBeanDefinitionStoreException(resource.getDescription(),
"XML document from " + resource + " is invalid", ex);
}
catch (ParserConfigurationException ex) {
throw new BeanDefinitionStoreException(resource.getDescription(),
"Parser configuration exception parsing XML from " + resource, ex);
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(resource.getDescription(),
"IOException parsing XML document from " + resource, ex);
}
catch (Throwable ex) {
throw new BeanDefinitionStoreException(resource.getDescription(),
"Unexpected exception parsing XML document from " + resource, ex);
}
}
通過原始碼分析,載入Bean 配置資訊的最後一步是將Bean 配置資訊轉換為Document 物件,該過程由documentLoader()方法實現。
相關文章
- 基於Xml 的IOC 容器-準備文件物件XML物件
- 基於viper的配置讀取
- Spring_Mybatis整合 註解配置類與xml配置檔案兩種方式分析及初始化IOC容器與監聽獲取取IOC容器SpringMyBatisXML
- IOC - 讀取配置檔案
- Spring IOC XML配置SpringXML
- Spring Boot 讀取配置內容的三種方式Spring Boot
- Spring系列:基於XML的方式構建IOCSpringXML
- php獲取xml檔案內容PHPXML
- mapper.xml基礎內容APPXML
- Spring基於註解的IoC配置Spring
- PHP 讀取 WORD 內容PHP
- PHP讀取WORD內容PHP
- 讀取.net core配置檔案appsetting.json內容APPJSON
- js 讀取 input file 的內容JS
- spring boot基於Java的容器配置Spring BootJava
- Unity 讀取xmlUnityXML
- 多次讀取 HttpServletRequest 中 body 內容HTTPServlet
- mybatis讀取properties檔案內容MyBatis
- 八、.net core(.NET 6)配置讀取appsettings檔案內容的通用功能APP
- Spring基礎使用(一)--------IOC、Bean的XML方式SpringBeanXML
- C# XML基礎入門(XML檔案內容增刪改查清)C#XML
- spring上 -基於Xml配置bean筆記SpringXMLBean筆記
- Python-使用openpyxl讀取excel內容PythonExcel
- 基於thincmf的內容管理系統
- Spring原始碼閱讀-IoC容器解析Spring原始碼
- 2、Spring使用+ioc容器配置使用1Spring
- 基於XML的DIXML
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- 用PHP換個思路讀取WORD內容PHP
- EasyExcel 輕鬆靈活讀取Excel內容Excel
- 基於thinkphp5+layui開的CLTPHP內容管理系統PHPUI
- 用 ABAP 讀取本地文字檔案內容試讀版
- Laravel的Ioc容器Laravel
- Spring的IOC容器Spring
- Flex 容器寬度被內容撐開的問題Flex
- 序列化篇 生成xml 以及讀取xmlXML
- vite vue-cli 讀取檔案原始內容 使用base64內容的檔案ViteVue
- IOC容器