簡體   English   中英

Spring實用程序方法,用於將類轉換為通用Bean名稱

[英]Spring utility method to convert class to generic bean name

我的資源有一個常量,該常量是帶有低位第一個字母的類名。

是否有Spring實用程序方法將類類型轉換為首字母降低的字符串? 這使我可以安全地重構類名。

例如:

SpringXXX.defaultBeanNameYYY(MyCustomBeanFactoryProcessor.class)

應該產生:

myCustomBeanFactoryProcessor

默認情況下,形成Bean名稱的機制稱為BeanNameGenerator (取決於上下文的類型,它可以是AnnotationBeanNameGeneratorDefaultBeanNameGenerator )。 要生成名稱,它需要一個bean定義和一個上下文,該定義來自於:

new AnnotationBeanNameGenerator().generateBeanName(definition, context);

例如,您可以在提供ConfigurableListableBeanFactory實例的BeanFactoryPostProcessor子類中編寫此處理過程:

class MyCustomBeanFactoryProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
        String beanName = new AnnotationBeanNameGenerator()
                .generateBeanName(new AnnotatedGenericBeanDefinition(MyCustomBeanFactoryProcessor.class),
                                  (BeanDefinitionRegistry) factory);
    }
}

最后,如果我們放棄上下文和Spring所做的所有檢查,我們可以執行:

Introspector.decapitalize(MyCustomBeanFactoryProcessor.class.getSimpleName());

要么

Introspector.decapitalize(ClassUtils.getShortName(MyCustomBeanFactoryProcessor.class));

您可以這樣寫自己:

    public class BeanUtils {
        public static String firstToLowerCase(Class clazz) {
            String string = clazz.getSimpleName();
            String post = string.substring(1, string.length());
            String first = ("" + string.charAt(0)).toLowerCase();
            return first + post;
        }
    }

並這樣調用: BeanUtils.firstToLowerCase(MyCustomBeanFactoryProcessor.class)

使用getSimpleName字符串作為從@shi搜索查詢,我發現一個這樣實施了一絲spring-core/src/main/java/org/springframework/util/ClassUtils.java

/**
 * Return the short string name of a Java class in uncapitalized JavaBeans
 * property format. Strips the outer class name in case of an inner class.
 * @param clazz the class
 * @return the short name rendered in a standard JavaBeans property format
 * @see java.beans.Introspector#decapitalize(String)
 */
public static String getShortNameAsProperty(Class<?> clazz) {
    String shortName = getShortName(clazz);
    int dotIndex = shortName.lastIndexOf(PACKAGE_SEPARATOR);
    shortName = (dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName);
    return Introspector.decapitalize(shortName);
}

用法:

@Test
public void my() {
    String str = org.springframework.util.ClassUtils.getShortNameAsProperty(MyCustomBeanFactoryProcessor.class);
    Assert.assertEquals("myCustomBeanFactoryProcessor", str);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM