Java 将类转换为泛型bean名称的Spring实用程序方法

Java 将类转换为泛型bean名称的Spring实用程序方法,java,spring,Java,Spring,我的源代码有一个常数,它是第一个字母较低的类名 是否存在将类类型转换为首字母较低的字符串的Spring实用程序方法?这允许我安全地重构类名 例如: SpringXXX.defaultBeanNameYYY(MyCustomBeanFactoryProcessor.class) 应产生: myCustomBeanFactoryProcessor 你可以自己这样写: public class BeanUtils { public static String firstTo

我的源代码有一个常数,它是第一个字母较低的类名

是否存在将类类型转换为首字母较低的字符串的Spring实用程序方法?这允许我安全地重构类名

例如:

SpringXXX.defaultBeanNameYYY(MyCustomBeanFactoryProcessor.class)
应产生:

myCustomBeanFactoryProcessor

你可以自己这样写:

    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)
默认情况下,形成bean名称的机制称为
BeanNameGenerator
(根据上下文的类型,它可能是
注释BeanNameGenerator
默认BeanNameGenerator
)。要生成名称,它需要一个bean定义和该定义来自的上下文:

new AnnotationBeanNameGenerator().generateBeanName(definition, context);
例如,您可以在
BeanFactoryPostProcessor
子类中编写此处理,其中给出了
ConfigurableListableBeanFactory
实例:

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());


使用
getSimpleName
string作为来自@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);
}

我想OP希望通过Spring的资源来实现它,而不是手工编写。哇<代码>内省.decapitalize在标准Java中。@gavenkoa,如果您使用Spring进行这些转换,可能最好不要使用Spring特定的类,不是吗?否则,我建议考虑使用上下文和定义的方法。
/**
 * 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);
}