基于Xml 的IOC 容器-开始读取配置内容
生活随笔
收集整理的這篇文章主要介紹了
基于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 容器-开始读取配置内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过ObjectProvider进行依赖
- 下一篇: 基于Xml 的IOC 容器-准备文档对象