protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); //从这块代码
可以发现XML的解析估计是在这里发生的,也就是这个Reader来读取的,
....
loadBeanDefinitions(beanDefinitionReader);
}
….
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
Resource[] configResources = getConfigResources();
if (configResources != null) {
reader.loadBeanDefinitions(configResources); //果然是由Reader来加载和解析XML并载入BeanDefinition中的!
}
String[] configLocations = getConfigLocations();
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
throws BeanDefinitionStoreException {
try {
int validationMode = getValidationModeForResource(resource);
Document doc = this.documentLoader.loadDocument(
inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware());
//在这里激发注册过程
return registerBeanDefinitions(doc, resource);
}
catch (BeanDefinitionStoreException ex) {
throw ex;
}
catch (SAXParseException ex) {
…
}
从上上面的代码中,你可以肯定的是
XML
是在
XmlBeanDefinitionReader
类中解析的,解析到
BeanDefinition
中!进入
XmlBeanDefinitionReader
中,看一看:
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<EncodedResource>(4);
this.resourcesCurrentlyBeingLoaded.set(currentResources);
}
if (!currentResources.add(encodedResource)) {
throw new BeanDefinitionStoreException(
"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
}
try {
InputStream inputStream = encodedResource.getResource().getInputStream();
try {
InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding());
}
//这里是具体加载的实现逻辑
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
......
}
哈哈,你也可以看到
ReaourceLoader
确实是加载
XML
的!进入
doLoadBeanDefinitions
方法!
-------------TODO,这里需要补充一下
--------------------------------------------------------------------------------------------------------
看到了吧?就是一个大家经常用到
SAX
的
Document
来取得
XML
文档的,在进入
registerBeanDefinitions
看看!
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
if (documentReader instanceof DefaultBeanDefinitionDocumentReader) {
((DefaultBeanDefinitionDocumentReader)documentReader).setEnvironment(this.getEnvironment());
}
int countBefore = getRegistry().getBeanDefinitionCount();
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));//在这里注册,也就是注册到一个共享的容器中,比如Map.这样缓存起来后,spring其他部分就可以从一个共享的位置加载目标BeanDefinition了(通过BeanDefinition的名字)。
return getRegistry().getBeanDefinitionCount() - countBefore;
}
在进入
documentReader.registerBeanDefinitions
看看!
protected void doRegisterBeanDefinitions(Element root) {
String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
boolean isCandidate = false;
if (profileSpec == null || profileSpec.equals("")) {
isCandidate = true;
} else {
String[] profiles = commaDelimitedListToStringArray(trimAllWhitespace(profileSpec));
for (String profile : profiles) {
if (this.environment.getActiveProfiles().contains(profile)) {
isCandidate = true;
break;
}
}
}
if (!isCandidate) {
return;
}
BeanDefinitionParserDelegate parent = this.delegate;//Deletgate里面包含着多有XML属性和elemnt的结构信息
this.delegate = createHelper(readerContext, root, parent);
preProcessXml(root);
parseBeanDefinitions(root, this.delegate);
postProcessXml(root);
分享到:
相关推荐
《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring框架是Java开发中不可或缺的一部分,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,提供了丰富的功能来简化企业级应用的开发。当我们深入理解...
《Spring Boot 揭秘与实战》系列源代码涉及了使用Spring Boot框架进行开发的一系列实践案例,包括但不限于配置、编码、测试以及部署等方面。作为当今流行的开源框架,Spring Boot简化了基于Spring的应用开发,通过...
1. **SpringBoot**:SpringBoot是Spring平台和第三库的集成,它利用了Spring框架的核心特性,简化了配置文件,实现了自动配置,并且支持快速构建独立的Spring应用程序。 - **优点**:易于理解和使用,可快速搭建...
源代码将被合理组织,并包含适当的注释,以便其他开发者理解和维护。此外,代码将遵循代码规范和最佳实践,确保代码质量。 系统的用户界面将采用现代化的Web设计语言,如HTML5、CSS3和JavaScript等,以提供响应式和...
【标题】"20170117-171626-49634_java书城系统_网上书城_源码"所指的是一个基于Java编程语言开发的网上书城系统源代码。这个系统可能包含了实现网上书店核心功能的所有必要组件,如用户管理、书籍展示、购物车、订单...
在平台的实现过程中,sheuquyanglaofuwu这一子文件夹包含了所有的源代码文件,这些源码文件是整个平台的核心,通过它们的整合和编译,最终形成了可供部署和运行的养老服务应用程序。 springboot187社区养老服务平台...
本项目是一个基于Java语言,采用ssm(Spring+SpringMVC+MyBatis)框架开发的电影推荐系统,其核心算法是协同过滤(Collaborative Filtering),并提供了完整的源代码、说明文档以及演示PPT。 协同过滤是推荐系统中...