Spring BeanDefinitionHolder源码解析

BeanDefinitionHolder源码解析

继承关系

实现的接口

BeanDefinition一样实现了BeanMetadataElement接口,获得了获取数据源(配置类的class对象)的能力。

/**
 *  将由承载配置源对象的bean元数据元素实现的接口。
 */
public interface BeanMetadataElement {
   /**
    * 返回此元数据元素的配置源{@code  Object}(可以为{@code  null})。 
    */
   @Nullable
   default Object getSource() {
      return null;
   }
}

本类解析

具有名称和别名的BeanDefinition的持有人。 可以注册为内部bean的占位符。 还可以用于内部bean定义的程序化注册。 如果您不关心BeanNameAware之类的东西,那么注册RootBeanDefinition或ChildBeanDefinition就足够了。


public class BeanDefinitionHolder implements BeanMetadataElement {
   /**
    * 要包含的BeanDefinition
    */
   private final BeanDefinition beanDefinition;
  /**
    * BeanDefinition对应的beanName
    */
   private final String beanName;
  /**
    * BeanDefinition对应的别名集合
    */
   @Nullable
   private final String[] aliases;

   /**
    * 创建一个新的BeanDefinitionHolder。 
    * @param  beanDefinition 要包装的BeanDefinition
    * @param  beanName bean名称,为bean定义指定的名称
    */
   public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName) {
      this(beanDefinition, beanName, null);
   }

   /**
    * 创建一个新的BeanDefinitionHolder。 
    * @param  beanDefinition bean包装的BeanDefinition 
    * @param  beanName 为bean定义指定的bean名称。
    * @param aliases bean的别名,或者{@code null}(如果没有)
    */
   public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, @Nullable String[] aliases) {
      Assert.notNull(beanDefinition, "BeanDefinition must not be null");
      Assert.notNull(beanName, "Bean name must not be null");
      this.beanDefinition = beanDefinition;
      this.beanName = beanName;
      this.aliases = aliases;
   }

   /**
    * 复制构造函数:创建一个新的BeanDefinitionHolder,其内容与给定的BeanDefinitionHolder实例相同。 
    *  <p>注意:包装好的BeanDefinition引用按原样使用; 
    *  这不是深度复制。 
    * @param  beanDefinitionHolder 要复制的BeanDefinitionHolder
    */
   public BeanDefinitionHolder(BeanDefinitionHolder beanDefinitionHolder) {
      Assert.notNull(beanDefinitionHolder, "BeanDefinitionHolder must not be null");
      this.beanDefinition = beanDefinitionHolder.getBeanDefinition();
      this.beanName = beanDefinitionHolder.getBeanName();
      this.aliases = beanDefinitionHolder.getAliases();
   }

   /**
    * 返回包装的BeanDefinition。 
    * 
    */
   public BeanDefinition getBeanDefinition() {
      return this.beanDefinition;
   }
    
   /**
    * 返回为bean定义指定的bean的主要名称。 
    * 
    */
   public String getBeanName() {
      return this.beanName;
   }

   /**
    * 返回直接为bean定义指定的bean的别名。 
    * @return 别名名称的数组; 
    * 如果没有别名,则为{<@@code> null}
    */
   @Nullable
   public String[] getAliases() {
      return this.aliases;
   }
    
   /**
    * 公开bean定义的源对象。 
    *  
    * @see  BeanDefinition#getSource()
    */
   @Override
   @Nullable
   public Object getSource() {
      return this.beanDefinition.getSource();
   }

   /**
    * 确定给定的候选名称是否与Bean名称或此Bean定义中存储的别名匹配。 
    */
   public boolean matchesName(@Nullable String candidateName) {
      return (candidateName != null && (candidateName.equals(this.beanName) ||
            candidateName.equals(BeanFactoryUtils.transformedBeanName(this.beanName)) ||
            ObjectUtils.containsElement(this.aliases, candidateName)));
   }

   /**
    * 返回该bean的友好简短描述,名称和别名。 
    * @see  #getBeanName()
    * @see  #getAliases()
    */
   public String getShortDescription() {
      if (this.aliases == null) {
         return "Bean definition with name '" + this.beanName + "'";
      }
      return "Bean definition with name '" + this.beanName + "' and aliases [" + StringUtils.arrayToCommaDelimitedString(this.aliases) + ']';
   }

   /**
    * 返回该bean的详细描述,包括名称和别名,以及对包含的{@link  BeanDefinition}的描述。 
    *  
    * @see  #getShortDescription()
    * @see  #getBeanDefinition()
    */
   public String getLongDescription() {
      return getShortDescription() + ": " + this.beanDefinition;
   }

   /**
    * 此实现返回详细描述。 
    * 可以重写以返回简短描述或任何类型的自定义描述。 
    *  
    * @see  #getLongDescription()
    * @see  #getShortDescription()
    */
   @Override
   public String toString() {
      return getLongDescription();
   }


   @Override
   public boolean equals(@Nullable Object other) {
      if (this == other) {
         return true;
      }
      if (!(other instanceof BeanDefinitionHolder)) {
         return false;
      }
      BeanDefinitionHolder otherHolder = (BeanDefinitionHolder) other;
      return this.beanDefinition.equals(otherHolder.beanDefinition) &&
            this.beanName.equals(otherHolder.beanName) &&
            ObjectUtils.nullSafeEquals(this.aliases, otherHolder.aliases);
   }

   @Override
   public int hashCode() {
      int hashCode = this.beanDefinition.hashCode();
      hashCode = 29 * hashCode + this.beanName.hashCode();
      hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.aliases);
      return hashCode;
   }

}

总结

BeanDefinitionHolder就是BeanDefinition + beanName + beanAlias的持有者。
疑问:

BeanNameAware是啥?

猜你喜欢

转载自www.cnblogs.com/akfak/p/12377799.html
今日推荐