美文网首页
BeanNameGenerator如何改变beanName的生成

BeanNameGenerator如何改变beanName的生成

作者: 李逍遥JK | 来源:发表于2020-05-17 22:13 被阅读0次

    Spring中Bean名的自定义生成策略

    1. AnnotationBeanNameGenerator

     /**
         * 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);
        }
    

    正常情况下将首字母变成消息,当第一第二个字母都是大写时,不做任何改变。

    2. DefaultBeanGenerator

        /**
         * Generate a bean name for the given bean definition, unique within the
         * given bean factory.
         * @param definition the bean definition to generate a bean name for
         * @param registry the bean factory that the definition is going to be
         * registered with (to check for existing bean names)
         * @param isInnerBean whether the given bean definition will be registered
         * as inner bean or as top-level bean (allowing for special name generation
         * for inner beans versus top-level beans)
         * @return the generated bean name
         * @throws BeanDefinitionStoreException if no unique name can be generated
         * for the given bean definition
         */
        public static String generateBeanName(
                BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean)
                throws BeanDefinitionStoreException {
    
            String generatedBeanName = definition.getBeanClassName();
            if (generatedBeanName == null) {
                if (definition.getParentName() != null) {
                    // parent$child
                    generatedBeanName = definition.getParentName() + "$child";
                }
                else if (definition.getFactoryBeanName() != null) {
                    // factoryName$create
                    generatedBeanName = definition.getFactoryBeanName() + "$created";
                }
            }
            // 如果字符串里面的值为null, "", "   ",那么返回值为false;否则为true
            if (!StringUtils.hasText(generatedBeanName)) {
                throw new BeanDefinitionStoreException("Unnamed bean definition specifies neither " +
                        "'class' nor 'parent' nor 'factory-bean' - can't generate bean name");
            }
    
            String id = generatedBeanName;
            if (isInnerBean) {
                // 内部类 
                // Inner bean: generate identity hashcode suffix.
                id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils.getIdentityHexString(definition);
            }
            else {
                // Top-level bean: use plain class name with unique suffix if necessary.
                return uniqueBeanName(generatedBeanName, registry);
            }
            return id;
        }
    

    当bean 是顶级类的时候的生成策略

        /**
         * Turn the given bean name into a unique bean name for the given bean factory,
         * appending a unique counter as suffix if necessary.
         * @param beanName the original bean name
         * @param registry the bean factory that the definition is going to be
         * registered with (to check for existing bean names)
         * @return the unique bean name to use
         * @since 5.1
         */
        public static String uniqueBeanName(String beanName, BeanDefinitionRegistry registry) {
            String id = beanName;
            int counter = -1;
    
            // Increase counter until the id is unique.
            // 不停+1 重试是否已经有名称,知到生成成功
            while (counter == -1 || registry.containsBeanDefinition(id)) {
                counter++;
                id = beanName + GENERATED_BEAN_NAME_SEPARATOR + counter;
            }
            return id;
        }
    

    相关文章

      网友评论

          本文标题:BeanNameGenerator如何改变beanName的生成

          本文链接:https://www.haomeiwen.com/subject/toleohtx.html