`
leogao_emcom
  • 浏览: 83239 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Spring框架核心源代码的分析及其感受-3

阅读更多
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);

 

 

      

0
1
分享到:
评论

相关推荐

    Spring框架核心源代码的分析及其感受-6

    《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...

    Spring5 框架 ---- AOP ---- 代码

    Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...

    Spring5 框架 ---- 事务操作 ---- 代码

    Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 --...

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    JavaEE源代码 spring-toplink

    JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...

    JavaEE源代码 spring-core

    JavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源...

    JavaEE源代码 spring-jpa

    JavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 ...

    JavaEE源代码 spring-jdo

    JavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 ...

    JavaEE源代码 spring-dao

    JavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 ...

    JavaEE源代码 spring-jdbc

    JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...

    JavaEE源代码 spring-mock

    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 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring...

    JavaEE源代码 spring-ibatis

    JavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 ...

    JavaEE源代码 spring-beans

    JavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-...

    JavaEE源代码 spring-context

    JavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源...

    Spring框架核心源代码的分析及其感受.pdf

    Spring的源代码分析,不仅仅是技术层面的学习,更是对软件工程思想的探索。它教会我们如何分析问题,如何利用现有知识系统,如何对待不同的设计理念,以及如何更好地学习和使用工具。这种深入的理解可以帮助我们成长...

    JavaEE源代码 struts2-spring-plugin-2.0.11

    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-hibernate3

    JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-...

    spring框架学习源代码

    在"spring框架学习源代码"这个资料中,你将有机会深入理解并实践这些关键概念。 首先,让我们从Spring的IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)开始。IOC是指应用程序不再...

    spring核心技术源代码spring核心技术源代码1-9章

    通过阅读并分析这些源代码,开发者可以更深入地理解Spring框架的工作机制,学习如何有效地使用其特性来提高代码的可维护性和可扩展性。每个章节都会提供实际的示例,帮助开发者将理论知识转化为实践技能。对于想要...

Global site tag (gtag.js) - Google Analytics