读书人

基于XML资料读取bean定义:XmlBeanDef

发布时间: 2012-11-07 09:56:10 作者: rapoo

基于XML文件读取bean定义:XmlBeanDefinitionReader
基于XML文件读取bean定义
除了基于Properties文件读取bean的定义,这里介绍另一种读取bean的定义方式。这中方式更为常见。
XmlBeanDefinitionReader
主要方法介绍:
loadBeanDefinitions();//加载bean的定义,同样是通过用被指定的编码方式来读取流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());}try {InputStream inputStream = encodedResource.getResource().getInputStream();try {InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {//如果指定了编码方式,就用指定的编码为流的编码inputSource.setEncoding(encodedResource.getEncoding());}//这类调用该方式真正的做到了加载bean定义return doLoadBeanDefinitions(inputSource, encodedResource.getResource());}finally {//关闭流inputStream.close();}}catch (IOException ex) {throw new BeanDefinitionStoreException("IOException parsing XML document from " + encodedResource.getResource(), ex);}}


doLoadBeanDefinitions();该方法真正完成加载bean定义的工作
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)throws BeanDefinitionStoreException {try {//取得xml文件的文档验证方式,比如dtd,xsd。int validationMode = getValidationModeForResource(resource);//加载器加载xml文件。Document doc = this.documentLoader.loadDocument(inputSource, this.entityResolver, this.errorHandler, validationMode, this.namespaceAware);//调用下面介绍的方法注册bean到工厂return registerBeanDefinitions(doc, resource);}catch (BeanDefinitionStoreException ex) {throw ex;}catch (ParserConfigurationException ex) {throw new BeanDefinitionStoreException("Parser configuration exception parsing XML from " + resource, ex);}catch (SAXParseException ex) {throw new BeanDefinitionStoreException("Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex);}catch (SAXException ex) {throw new BeanDefinitionStoreException("XML document from " + resource + " is invalid", ex);}catch (IOException ex) {throw new BeanDefinitionStoreException("IOException parsing XML document from " + resource, ex);}catch (Throwable ex) {throw new BeanDefinitionStoreException("Unexpected exception parsing XML document from " + resource, ex);}}

registerBeanDefinitions();这里完成注册bean到工厂的工作。
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {if (this.parserClass != null) {//拿到解析器负责从xml解析定义的bean,并负责将它们注册到工厂XmlBeanDefinitionParser parser =(XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass);return parser.registerBeanDefinitions(this, doc, resource);}//若解析器为null,就创建一个documentReader ,把解析bean定义并注册bean到工厂的工作交给它完成BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();int countBefore = getBeanFactory().getBeanDefinitionCount();documentReader.registerBeanDefinitions(doc, createReaderContext(resource));return getBeanFactory().getBeanDefinitionCount() - countBefore;}

读书人网 >XML SOAP

热点推荐