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

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

阅读更多

好了!这里又出现了新的类型 BeanDefinitionParserDelegate 干什么用的?不过我知道这肯定和 XML 解析有关,所以不容错过!于是乎,简单浏览了一下它的实现(怕进入代码丛林!),我的天啊,我找到正题了:

public class BeanDefinitionParserDelegate {

 

    public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans" ;

 

    public static final String BEAN_NAME_DELIMITERS = ",; " ;

 

 

    public static final String TRUE_VALUE = "true" ;

 

    public static final String FALSE_VALUE = "false" ;

 

    public static final String DEFAULT_VALUE = "default" ;

 

    public static final String DESCRIPTION_ELEMENT = "description" ;

 

    public static final String AUTOWIRE_NO_VALUE = "no" ;

 

    public static final String AUTOWIRE_BY_NAME_VALUE = "byName" ;

 

    public static final String AUTOWIRE_BY_TYPE_VALUE = "byType" ;

 

    public static final String AUTOWIRE_CONSTRUCTOR_VALUE = "constructor" ;

 

    public static final String AUTOWIRE_AUTODETECT_VALUE = "autodetect" ;

 

    public static final String DEPENDENCY_CHECK_ALL_ATTRIBUTE_VALUE = "all" ;

 

    public static final String DEPENDENCY_CHECK_SIMPLE_ATTRIBUTE_VALUE = "simple" ;

 

    public static final String DEPENDENCY_CHECK_OBJECTS_ATTRIBUTE_VALUE = "objects" ;

 

    public static final String NAME_ATTRIBUTE = "name" ;

…..

这不是我们在 Spring XML 配置文件中经常看到的 XML 属性名称吗!我又看看了下面一些方法!

protected void populateDefaults(DocumentDefaultsDefinition defaults, DocumentDefaultsDefinition parentDefaults, Element root) {

       String lazyInit = root.getAttribute( DEFAULT_LAZY_INIT_ATTRIBUTE );

       if ( DEFAULT_VALUE .equals(lazyInit)) {

           lazyInit = parentDefaults != null ? parentDefaults.getLazyInit() : FALSE_VALUE ;

       }

       defaults.setLazyInit(lazyInit);

 

       String merge = root.getAttribute( DEFAULT_MERGE_ATTRIBUTE );

       if ( DEFAULT_VALUE .equals(merge)) {

           merge = parentDefaults != null ? parentDefaults.getMerge() : FALSE_VALUE ;

       }

       defaults.setMerge(merge);

 

       String autowire = root.getAttribute( DEFAULT_AUTOWIRE_ATTRIBUTE );

       if ( DEFAULT_VALUE .equals(autowire)) {

           autowire = parentDefaults != null ? parentDefaults.getAutowire() : AUTOWIRE_NO_VALUE ;

       }

       defaults.setAutowire(autowire);

 

       defaults.setDependencyCheck(root.getAttribute( DEFAULT_DEPENDENCY_CHECK_ATTRIBUTE ));

 

       if (root.hasAttribute( DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE )) {

           defaults.setAutowireCandidates(root.getAttribute( DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE ));

       } else if (parentDefaults != null ) {

           defaults.setAutowireCandidates(parentDefaults.getAutowireCandidates());

       }

 

       if (root.hasAttribute( DEFAULT_INIT_METHOD_ATTRIBUTE )) {

           defaults.setInitMethod(root.getAttribute( DEFAULT_INIT_METHOD_ATTRIBUTE ));

       } else if (parentDefaults != null ) {

           defaults.setInitMethod(parentDefaults.getInitMethod());

       }

 

       if (root.hasAttribute( DEFAULT_DESTROY_METHOD_ATTRIBUTE )) {

           defaults.setDestroyMethod(root.getAttribute( DEFAULT_DESTROY_METHOD_ATTRIBUTE ));

       } else if (parentDefaults != null ) {

           defaults.setDestroyMethod(parentDefaults.getDestroyMethod());

       }

 

       defaults.setSource( this . readerContext .extractSource(root));

    }

这不就是解析的过程吗?咦?装入 BeanDefinition 中的逻辑在什么地方,我们不能在 Spring 代码其他地方直接使用这些配置信息啊,只能给它们包装到一个实体类啊(当数据结构过长,一般是用实体类来存储的,哈哈,我也明白 BeanDefinitio 的设计目的了!)我继续在这个类里面找:

public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {

       String id = ele.getAttribute( ID_ATTRIBUTE );

       String nameAttr = ele.getAttribute( NAME_ATTRIBUTE );

 

       List<String> aliases = new ArrayList<String>();

       if (StringUtils.hasLength (nameAttr)) {

           String[] nameArr = StringUtils.tokenizeToStringArray (nameAttr, BEAN_NAME_DELIMITERS );

           aliases.addAll(Arrays.asList (nameArr));

           // 别名的解析

       }

 

       String beanName = id;

       if (!StringUtils.hasText (beanName) && !aliases.isEmpty()) {

           beanName = aliases.remove(0); // 第一个作为 Bean 的默认名称 ,very good!

           if ( logger .isDebugEnabled()) {

              logger .debug( "No XML 'id' specified - using '" + beanName +

                     "' as bean name and " + aliases + " as aliases" );

           }

       }

 

       if (containingBean == null ) {

           //check bean 名是不是在容器中唯一

           checkNameUniqueness(beanName, aliases, ele);

       }

 

       // 在这里具体创建 beanDefinition 实例,非常好的逻辑,代码逻辑清晰

       AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);

       if (beanDefinition != null ) {

           if (!StringUtils.hasText (beanName)) {

              try {

                  if (containingBean != null ) {

                     // 没有 Bean 名的话,就生成一个 ,. 供内部使用

                     beanName = BeanDefinitionReaderUtils.generateBeanName (

                            beanDefinition, this . readerContext

0
0
分享到:
评论

相关推荐

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

    NULL 博文链接:https://leospace.iteye.com/blog/809926

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

    JavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源...

    JavaEE源代码 spring-jdbc

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

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

    spring框架学习源代码

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

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

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

    mysql-jdbc-Spring源代码分析

    mysql-jdbc-Spring源代码分析 mysql-jdbc-Spring源代码分析 mysql-jdbc-Spring源代码分析

Global site tag (gtag.js) - Google Analytics