Spring BeanNameGenerator

  • Author: HuiFer
  • 源码阅读仓库: SourceHot-spring

  • org.springframework.beans.factory.support.BeanNameGenerator

  • 方法用来生成 beanName
  1. public interface BeanNameGenerator {
  2. /**
  3. * Generate a bean name for the given bean definition.
  4. * 生成 beanName
  5. * @param definition the bean definition to generate a name for
  6. * @param registry the bean definition registry that the given definition
  7. * is supposed to be registered with
  8. * @return the generated bean name
  9. */
  10. String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry);
  11. }

Spring BeanNameGenerator - 图1

DefaultBeanNameGenerator

  • org.springframework.beans.factory.support.DefaultBeanNameGenerator

  • 调用工具类方法进行生成

  1. @Override
  2. public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
  3. return BeanDefinitionReaderUtils.generateBeanName(definition, registry);
  4. }
  1. ClassName + # + 十六进制字符
  2. parentName + \$child + # + 十六进制字符
  3. factoryBeanName +\$created+# + 十六进制字符
  4. beanName + # + 序号
  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. }

AnnotationBeanNameGenerator

  1. 获取注解的 value 作为 beanName
  2. 类名首字母小写
  1. @Override
  2. public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
  3. if (definition instanceof AnnotatedBeanDefinition) {
  4. // 从注解中获取 beanName
  5. // 获取注解的value属性值
  6. String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
  7. if (StringUtils.hasText(beanName)) {
  8. // Explicit bean name found.
  9. // 如果存在直接返回
  10. return beanName;
  11. }
  12. }
  13. // Fallback: generate a unique default bean name.
  14. // 默认beanName
  15. // 类名,首字母小写
  16. return buildDefaultBeanName(definition, registry);
  17. }

FullyQualifiedAnnotationBeanNameGenerator

  • 全类名
  1. @Override
  2. protected String buildDefaultBeanName(BeanDefinition definition) {
  3. String beanClassName = definition.getBeanClassName();
  4. Assert.state(beanClassName != null, "No bean class name set");
  5. return beanClassName;
  6. }