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
是啥?