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的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...
Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 --...
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
JavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源...
JavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 ...
JavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 ...
JavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 ...
JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...
JavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源...
Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring...
JavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 ...
JavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-...
JavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源...
Spring的源代码分析,不仅仅是技术层面的学习,更是对软件工程思想的探索。它教会我们如何分析问题,如何利用现有知识系统,如何对待不同的设计理念,以及如何更好地学习和使用工具。这种深入的理解可以帮助我们成长...
JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-...
JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-...
在"spring框架学习源代码"这个资料中,你将有机会深入理解并实践这些关键概念。 首先,让我们从Spring的IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)开始。IOC是指应用程序不再...
通过阅读并分析这些源代码,开发者可以更深入地理解Spring框架的工作机制,学习如何有效地使用其特性来提高代码的可维护性和可扩展性。每个章节都会提供实际的示例,帮助开发者将理论知识转化为实践技能。对于想要...