Bean的命名規(guī)則-注解類

Bean的命名規(guī)則,定義在BeanNameGenerator接口的實(shí)現(xiàn)類

1.通過注解掃描Bean的命名規(guī)則

實(shí)現(xiàn)類:AnnotationBeanNameGenerator繼承了BeanNameGenerator
先看generateBeanName方法,這是入口

@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
    if (definition instanceof AnnotatedBeanDefinition) {
        String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
        if (StringUtils.hasText(beanName)) {
            // Explicit bean name found.
            return beanName;
        }
    }
    // Fallback: generate a unique default bean name.
    return buildDefaultBeanName(definition, registry);
}

這里判斷是否為注解類型的Bean,是的話通過注解內(nèi)容確定Bean名字;如果確認(rèn)不了,使用默認(rèn)方法生成Bean名字。
先看下怎么通過注解來判斷Bean名字,邏輯在determineBeanNameFromAnnotation方法里。

protected String determineBeanNameFromAnnotation(AnnotatedBeanDefinition annotatedDef) {
    AnnotationMetadata amd = annotatedDef.getMetadata();
    Set<String> types = amd.getAnnotationTypes();
    String beanName = null;
    for (String type : types) {
        AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(amd, type);
        if (isStereotypeWithNameValue(type, amd.getMetaAnnotationTypes(type), attributes)) {
            Object value = attributes.get("value");
            if (value instanceof String) {
                String strVal = (String) 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;
}

取到Bean的原信息里的注解信息,遍歷每個(gè)注解,確定注解是否符合條件的注解,取注解里的value值為Bean名字。
(符合條件:注解為@Component或者包含@Component或javax.annotation.ManagedBean或javax.inject.Named,且注解包含value屬性)
如果通過注解信息不能確認(rèn)Bean名字,那么就執(zhí)行默認(rèn)生成策略。

protected String buildDefaultBeanName(BeanDefinition definition) {
    String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
    return Introspector.decapitalize(shortClassName);
}

通過截取類的名字,變轉(zhuǎn)為符合Java變量名格式的字符串,作為Bean名字。下面是標(biāo)準(zhǔn)變量名的規(guī)則,變量名以小寫字母開頭,或者兩個(gè)大寫字母開頭。

public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }
流程圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,863評(píng)論 2 22
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,290評(píng)論 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,970評(píng)論 1 92
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 文|鐵爐 早晨七點(diǎn)臨起床,上午九時(shí)深北倉。 為把親人團(tuán)圓聚,喜悅開懷惠州行。 附注:本文“行...
    湘邵鐵爐閱讀 275評(píng)論 5 9

友情鏈接更多精彩內(nèi)容