• Spring @Service生成bean名称的规则


    今天碰到一个问题,写了一个@Service的bean,类名大致为:BKYInfoServcie.java

    dubbo export服务的配置:

    <dubbo:service interface="com.xxx.XxxService" ref="bKYInfoServcie" />

    结果启动报错:找不到名为bKYInfoServcie的bean

    bean的名字不是我预期的"bKYInfoServcie",临时将bean的名字指定成了bKYInfoServcie来解决的,即:@Service("bKYInfoServcie")

    但还是觉得比较奇怪,之前一直以为Spring对注解形式的bean的名字的默认处理就是将首字母小写,再拼接后面的字符,但今天看来不是这样的。

    回来翻了一下原码,原来还有另外的一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致

    复制代码
    复制代码
    /**
         * Derive a default bean name from the given bean definition.
         * <p>The default implementation simply builds a decapitalized version
         * of the short class name: e.g. "mypackage.MyJdbcDao" -> "myJdbcDao".
         * <p>Note that inner classes will thus have names of the form
         * "outerClassName.InnerClassName", which because of the period in the
         * name may be an issue if you are autowiring by name.
         * @param definition the bean definition to build a bean name for
         * @return the default bean name (never {@code null})
         */
        protected String buildDefaultBeanName(BeanDefinition definition) {
            String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
            return Introspector.decapitalize(shortClassName);
        }
    复制代码
    复制代码
    复制代码
    复制代码
        /**
         * Utility method to take a string and convert it to normal Java variable
         * name capitalization.  This normally means converting the first
         * character from upper case to lower case, but in the (unusual) special
         * case when there is more than one character and both the first and
         * second characters are upper case, we leave it alone.
         * <p>
         * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
         * as "URL".
         *
         * @param  name The string to be decapitalized.
         * @return  The decapitalized version of the string.
         */
        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); }
    复制代码
    复制代码

    原文地址:https://www.cnblogs.com/kevin-yuan/p/5437140.html

  • 相关阅读:
    单例设计模式
    Tomcat启动报错:严重: Unable to process Jar entry [moduleinfo.class]
    Liun常用命令
    Docker从入门到精通——内核兼容性
    Docker从入门到精通——配置Docker守护进程
    Docker从入门到精通——Dockerfile reference
    Docker从入门到精通——IP转发问题
    Docker从入门到精通——以非 root 用户身份管理 Docker
    Docker从入门到精通——Docker 本地镜像的漏洞扫描
    Docker从入门到精通——编写 Dockerfile 的最佳实践
  • 原文地址:https://www.cnblogs.com/renjiaqi/p/11577287.html
Copyright © 2020-2023  润新知