Spring BeanDefinitionReaderUtils

createBeanDefinition

  • org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition
  1. public static AbstractBeanDefinition createBeanDefinition(
  2. @Nullable String parentName, @Nullable String className, @Nullable ClassLoader classLoader) throws ClassNotFoundException {
  3. GenericBeanDefinition bd = new GenericBeanDefinition();
  4. // 设置 父bean
  5. bd.setParentName(parentName);
  6. if (className != null) {
  7. if (classLoader != null) {
  8. // 设置 class
  9. // 内部是通过反射创建 class
  10. bd.setBeanClass(ClassUtils.forName(className, classLoader));
  11. }
  12. else {
  13. // 设置 class name
  14. bd.setBeanClassName(className);
  15. }
  16. }
  17. return bd;
  18. }

generateBeanName

  • org.springframework.beans.factory.support.BeanDefinitionReaderUtils.generateBeanName(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry, boolean)
  1. public static String generateBeanName(
  2. BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean)
  3. throws BeanDefinitionStoreException {
  4. // 获取 bean class 的名称
  5. // Class.getName()
  6. String generatedBeanName = definition.getBeanClassName();
  7. if (generatedBeanName == null) {
  8. // 父类名称是否存在
  9. if (definition.getParentName() != null) {
  10. generatedBeanName = definition.getParentName() + "$child";
  11. }
  12. // 工厂 beanName 是否为空
  13. else if (definition.getFactoryBeanName() != null) {
  14. generatedBeanName = definition.getFactoryBeanName() + "$created";
  15. }
  16. }
  17. if (!StringUtils.hasText(generatedBeanName)) {
  18. throw new BeanDefinitionStoreException("Unnamed bean definition specifies neither " +
  19. "'class' nor 'parent' nor 'factory-bean' - can't generate bean name");
  20. }
  21. String id = generatedBeanName;
  22. if (isInnerBean) {
  23. // Inner bean: generate identity hashcode suffix.
  24. // 组装名称
  25. // 生成名称 + # + 16 进制的一个字符串
  26. id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils.getIdentityHexString(definition);
  27. }
  28. else {
  29. // Top-level bean: use plain class name with unique suffix if necessary.
  30. // 唯一beanName设置
  31. // // beanName + # + 序号
  32. return uniqueBeanName(generatedBeanName, registry);
  33. }
  34. return id;
  35. }

uniqueBeanName

  1. public static String uniqueBeanName(String beanName, BeanDefinitionRegistry registry) {
  2. String id = beanName;
  3. int counter = -1;
  4. // Increase counter until the id is unique.
  5. while (counter == -1 || registry.containsBeanDefinition(id)) {
  6. counter++;
  7. // beanName + # + 序号
  8. id = beanName + GENERATED_BEAN_NAME_SEPARATOR + counter;
  9. }
  10. return id;
  11. }

registerBeanDefinition

  1. public static void registerBeanDefinition(
  2. BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
  3. throws BeanDefinitionStoreException {
  4. // Register bean definition under primary name.
  5. // 获取 beanName
  6. String beanName = definitionHolder.getBeanName();
  7. // 注册bean definition
  8. registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
  9. // Register aliases for bean name, if any.
  10. // 别名列表
  11. String[] aliases = definitionHolder.getAliases();
  12. // 注册别名列表
  13. if (aliases != null) {
  14. for (String alias : aliases) {
  15. registry.registerAlias(beanName, alias);
  16. }
  17. }
  18. }

registerWithGeneratedName

  1. public static String registerWithGeneratedName(
  2. AbstractBeanDefinition definition, BeanDefinitionRegistry registry)
  3. throws BeanDefinitionStoreException {
  4. // 生成一个 beanName
  5. String generatedName = generateBeanName(definition, registry, false);
  6. // 注册 bean Definition
  7. registry.registerBeanDefinition(generatedName, definition);
  8. return generatedName;
  9. }