BeanDefinitionRegistry
源码解析
继承关系
继承的接口
AliasRegistry
主要用于别名注册,包含给beanName
注册别名,删除别名,判断是否为别名,以及获取beanName
对应的别名
/**
* 用于管理别名的通用接口。
* 用作{@link org.springframework.beans.factory.support.BeanDefinitionRegistry}的超级接口。
* @author 于尔根·霍勒(Juergen Hoeller)@2.5.2起
*/
public interface AliasRegistry {
/**
* 给定名称,为其注册一个别名。
* @param name the canonical name(简洁的名字)
* @param 别名 要注册的别名
* @throws IllegalStateException如果别名已在使用中并且可能不会被覆盖
*/
void registerAlias(String name, String alias);
/**
* 从此注册表中删除指定的别名。
*
* @param alias 将要删除的别名
* @throws IllegalStateException 找不到别名
*/
void removeAlias(String alias);
/**
* 确定给定名称是否被定义为别名(与实际注册的组件的名称相反)。
*
* @param name 要检查的名称
* @return 给定名称是否为别名
*/
boolean isAlias(String name);
/**
* 返回给定名称的别名(如果已定义)。
*
* @param name 要检查别名的bean的名称
* @return 别名,如果没有则为空数组
*/
String[] getAliases(String name);
}
本类解析
BeanDefinitionRegistry
用于根据beanName
注册BeanDefintion
,主要包括beanName
和对应 BeanDefinition
的注册、获取,removebeanName
对应的注册,判断beanName
是否已经注册,判断alias
和beanName
是否已经被使用,获得BeanDefinition
注册的个数,获得所有已注册的beanName
。
/**
* 包含BeanDefinition的注册表的接口,例如RootBeanDefinition和ChildBeanDefinition实例。
* 通常由内部使用AbstractBeanDefinition层次结构的BeanFactories实现。
* <p>这是Spring的bean工厂包中唯一封装<i>注册</ i> bean定义的接口。
* 标准BeanFactory接口仅涵盖对<i>完全配置的工厂实例</ i>的访问。
* <p> Spring的Bean定义读者希望可以使用此接口的实现。
* Spring核心中的已知实现者是DefaultListableBeanFactory和GenericApplicationContext。
* @author Juergen Hoeller @2003年11月26日起
* @see org.springframework.beans.factory.config.BeanDefinition
* @see AbstractBeanDefinition
* @see RootBeanDefinition
* @see ChildBeanDefinition
* @see DefaultListableBeanFactory
* @see org.springframework.context.support.GenericApplicationContext
* @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
* @see PropertiesBeanDefinitionReader
*/
public interface BeanDefinitionRegistry extends AliasRegistry {
/**
* 在此注册表中注册新的BeanDefinition。
* 必须支持RootBeanDefinition和ChildBeanDefinition。
*
* @param beanName 要注册的bean实例的名称
* @param beanDefinition 要注册的bean实例的BeanDefinition
* @throws BeanDefinitionStoreException 如果BeanDefinition无效
* @throws BeanDefinitionOverrideException 如果指定的bean已经有BeanDefinition名称,并且不
*/
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
/**
* 删除给定名称的BeanDefinition。
*
* @param beanName 已注册的bean实例的名称
* @throws NoSuchBeanDefinitionException 如果没有这样的bean定义
*/
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/**
* 返回给定bean名称的BeanDefinition。
*
* @param beanName Bean的名称,以查找给定名称的BeanDefinition
* @return beanName对应的BeanDefinition(不返回{@code null})
* @throws NoSuchBeanDefinitionException 如果没有这样的bean定义
*/
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/**
* 检查此注册表是否包含具有给定名称的BeanDefinition。
*
* @param beanName 要查找的bean的名字
* @return 是否这个注册中心包含给定的beanName对应的BeanDefinition
*
*/
boolean containsBeanDefinition(String beanName);
/**
* 返回此注册表中定义的所有bean的名称。
*
* @return 此注册表中定义的所有bean的名称;
* 如果未定义,则为空数组
*/
String[] getBeanDefinitionNames();
/**
* 返回注册表中定义的bean数。
*
* @return 注册表中定义的bean数
*/
int getBeanDefinitionCount();
/**
* 确定给定的beanName是否已在此注册表中使用,换言之是否在此名称下注册了使用beanName或对应alias的本地bean。
*
* @param beanName 要检查的名称
* @return 给定的bean名称是否已被使用
*/
boolean isBeanNameInUse(String beanName);
}
总结
首先负责beanName
和BeanDefinition
关系的映射(注册),同时实现了AliasRegistry
接口,将beanName
和alias
之间建立联系。