基于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;
}
分享到:
相关推荐
java8 源码 容器的基本实现 spring源码剖析,大部分都是基于Spring...XmlBeanFactory对DefaultListableBeanFactory进行了扩展,主要用于从XML文件中读取BeanDefinition,注册及获取Bean都是使用从父类继承的方法
2013-3-20 22:22:46 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [beans.xml] 2013-3-20 22:22:49 org....
//对于XmlWebApplicationContext,当然使用的是XmlBeanDefinitionReader来对bean定义信息来进行解析 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); ...
[[03 08:58:22,467 INFO ] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from file [/home/tomcats/...
第二句就是整个类中最重要的地方了,顾名思义,它的目的是通过XmlBeanDefinitionReader这个XML的Reader从资源resource中(也就是你的配置文件)读取bean的定义。接下来我们打开XmlBeanDefinitionReader的...
是Spring注册及加载bean的默认实现,XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。
一个很奇怪的“循环引用”警告 如果您运行my.Main ,您将看到输出如下: Jan 17, 2015 1:36:28 AM org.spring...Jan 17, 2015 1:36:28 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader lo
Spring 中最核心的两个类:DefaultListableBeanFactory 与 XmlBeanDefinitionReader spring源码DefaultListableBeanFactory类结构图
BeanDefinition BeanDefinitionBuilder BeanDefinitionDecorator BeanDefinitionDocumentReader BeanDefinitionHolder BeanDefinitionParser BeanDefinitionParserDelegate BeanDefinitionParsingException ...