diff --git a/README.md b/README.md index c4fe78b..7777c46 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ * [Spring MultiValueMap](/docs/Spring/clazz/Spring-MultiValueMap.md) * [Spring MethodOverride](/docs/Spring/clazz/Spring-MethodOverride.md) +* [Spring BeanDefinitionReaderUtils](/docs/Spring/clazz/Spring-BeanDefinitionReaderUtils.md) ### Spring5 新特性 diff --git a/docs/Spring/clazz/Spring-BeanDefinitionReaderUtils.md b/docs/Spring/clazz/Spring-BeanDefinitionReaderUtils.md new file mode 100644 index 0000000..b9c2c30 --- /dev/null +++ b/docs/Spring/clazz/Spring-BeanDefinitionReaderUtils.md @@ -0,0 +1,145 @@ +# Spring BeanDefinitionReaderUtils +- Author: [HuiFer](https://github.com/huifer) +- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read) + + + +## createBeanDefinition +- `org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition` + + + +```java +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; +} +``` + + + +## generateBeanName + +- `org.springframework.beans.factory.support.BeanDefinitionReaderUtils.generateBeanName(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry, boolean)` + +```java + 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; + } +``` + + + +## uniqueBeanName + +```java +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; +} +``` + + + + + +## registerBeanDefinition + +```java +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 + +```java +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; +} +``` \ No newline at end of file