Spring BeanDefinitionReaderUtils
org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition
public static AbstractBeanDefinition createBeanDefinition (
@ Nullable String parentName , @ Nullable String className , @ Nullable ClassLoader classLoader ) throws ClassNotFoundException {
GenericBeanDefinition bd = new GenericBeanDefinition ();
// 设置 父bean
bd .setParentName (parentName );
if (className != null ) {
if (classLoader != null ) {
// 设置 class
// 内部是通过反射创建 class
bd .setBeanClass (ClassUtils .forName (className , classLoader ));
}
else {
// 设置 class name
bd .setBeanClassName (className );
}
}
return bd ;
}
org.springframework.beans.factory.support.BeanDefinitionReaderUtils.generateBeanName(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry, boolean)
public static String generateBeanName (
BeanDefinition definition , BeanDefinitionRegistry registry , boolean isInnerBean )
throws BeanDefinitionStoreException {
// 获取 bean class 的名称
// Class.getName()
String generatedBeanName = definition .getBeanClassName ();
if (generatedBeanName == null ) {
// 父类名称是否存在
if (definition .getParentName () != null ) {
generatedBeanName = definition .getParentName () + "$child" ;
}
// 工厂 beanName 是否为空
else if (definition .getFactoryBeanName () != null ) {
generatedBeanName = definition .getFactoryBeanName () + "$created" ;
}
}
if (!StringUtils .hasText (generatedBeanName )) {
throw new BeanDefinitionStoreException ("Unnamed bean definition specifies neither " +
"'class' nor 'parent' nor 'factory-bean' - can't generate bean name" );
}
String id = generatedBeanName ;
if (isInnerBean ) {
// Inner bean: generate identity hashcode suffix.
// 组装名称
// 生成名称 + # + 16 进制的一个字符串
id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils .getIdentityHexString (definition );
}
else {
// Top-level bean: use plain class name with unique suffix if necessary.
// 唯一beanName设置
// // beanName + # + 序号
return uniqueBeanName (generatedBeanName , registry );
}
return id ;
}
public static String uniqueBeanName (String beanName , BeanDefinitionRegistry registry ) {
String id = beanName ;
int counter = -1 ;
// Increase counter until the id is unique.
while (counter == -1 || registry .containsBeanDefinition (id )) {
counter ++;
// beanName + # + 序号
id = beanName + GENERATED_BEAN_NAME_SEPARATOR + counter ;
}
return id ;
}
public static void registerBeanDefinition (
BeanDefinitionHolder definitionHolder , BeanDefinitionRegistry registry )
throws BeanDefinitionStoreException {
// Register bean definition under primary name.
// 获取 beanName
String beanName = definitionHolder .getBeanName ();
// 注册bean definition
registry .registerBeanDefinition (beanName , definitionHolder .getBeanDefinition ());
// Register aliases for bean name, if any.
// 别名列表
String [] aliases = definitionHolder .getAliases ();
// 注册别名列表
if (aliases != null ) {
for (String alias : aliases ) {
registry .registerAlias (beanName , alias );
}
}
}
registerWithGeneratedName
public static String registerWithGeneratedName (
AbstractBeanDefinition definition , BeanDefinitionRegistry registry )
throws BeanDefinitionStoreException {
// 生成一个 beanName
String generatedName = generateBeanName (definition , registry , false );
// 注册 bean Definition
registry .registerBeanDefinition (generatedName , definition );
return generatedName ;
}