自定义BeanNameGenerator生成规则

通过点进ComponentScan注解进入源码可以看到

在这里插入图片描述

追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法

在这里插入图片描述

点击上面黑色箭头出现两个实现方法在这里插入图片描述

点击第一个方法

在这里插入图片描述

进入determineBeanNameFromAnnotation方法中在这里插入图片描述

通过上诉自定义一个生成beanName方法

  • 先创建一个CustomeBeanNameGenerator类
  • 实现BeanNameGenerator接口
  • 重写generateBeanName方法
public class CustomeBeanNameGenerator implements BeanNameGenerator {
   

    @Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
   
        //定义Bean的名称
        String beanName = null;
        //1.判断当前bean的定义信息是否是注解的
        if(definition instanceof AnnotatedBeanDefinition){
   
           //2.把definition转成注解的bean定义信息
           AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition)definition;
           //2.获取注解Bean定义的元信息
           AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();
           //3.获取定义信息中的所有注解
           Set<String> types = annotationMetadata.getAnnotationTypes();
           //4.遍历types集合
           for(String type : types){
   
               //5.得到注解的属性
               AnnotationAttributes attributes = AnnotationAttributes.fromMap(annotationMetadata.getAnnotationAttributes(type, false));
               //6.判断attributes是否为null,同时必须是@Component及其衍生注解
               if (attributes != null && isStereotypeWithNameValue(type, annotationMetadata.getMetaAnnotationTypes(type), attributes)) {
   
                   //7.获取value属性的值
                   Object value = attributes.get("value");
                   //8.判断value属性是否为String类型
                   if (value instanceof String) {
   
                       String strVal = (String) value;
                       //9.判断value属性是否有值
                       if (StringUtils.hasLength(strVal)) {
   
                           if (beanName != null && !strVal.equals(beanName)) {
   
                               throw new IllegalStateException("Stereotype annotations suggest inconsistent " +
                                       "component names: '" + beanName + "' versus '" + strVal + "'");
                           }
                           beanName = strVal;
                       }
                   }
               }
           }
        }
        return beanName != null ? "my"+beanName : "my"+buildDefaultBeanName(definition);
    }

    private static final String COMPONENT_ANNOTATION_CLASSNAME = "org.springframework.stereotype.Component";

    private boolean isStereotypeWithNameValue(String annotationType,
                                                Set<String> metaAnnotationTypes, @Nullable Map<String, Object> attributes) {
   

        boolean isStereotype = annotationType.equals(COMPONENT_ANNOTATION_CLASSNAME) ||
                metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME) ||
                annotationType.equals("javax.annotation.ManagedBean") ||
                annotationType.equals("javax.inject.Named");

        return (isStereotype && attributes != null && attributes.containsKey("value"));
    }

    private String buildDefaultBeanName(BeanDefinition definition) {
   
        String beanClassName = definition.getBeanClassName();
        Assert.state(beanClassName != null, "No bean class name set");
        String shortClassName = ClassUtils.getShortName(beanClassName);
        return Introspector.decapitalize(shortClassName);
    }
}

相关推荐

  1. 深入Linux Core文件生成定义命名规则

    2024-01-31 18:58:01       35 阅读
  2. 【PHP】TP5验证规则定义

    2024-01-31 18:58:01       67 阅读
  3. vue中使用定义组件规则

    2024-01-31 18:58:01       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 18:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 18:58:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 18:58:01       82 阅读
  4. Python语言-面向对象

    2024-01-31 18:58:01       91 阅读

热门阅读

  1. oracle http使用实例

    2024-01-31 18:58:01       46 阅读
  2. Python异常处理与调试

    2024-01-31 18:58:01       60 阅读
  3. ES面试题合集

    2024-01-31 18:58:01       48 阅读
  4. python数据生成excel文件实现

    2024-01-31 18:58:01       56 阅读
  5. K210 UART串口通信介绍与 STM32通信

    2024-01-31 18:58:01       50 阅读
  6. 【FINS5513】Financial Excel

    2024-01-31 18:58:01       59 阅读
  7. 面试 CSS 框架八股文十问十答第二期

    2024-01-31 18:58:01       64 阅读