2017-02-12 1 views
1

Meine Quellen haben Konstante, die Klassenname mit niedrigeren ersten Buchstaben ist.Spring-Dienstprogramm-Methode zum Konvertieren der Klasse in generische Bean-Name

Gibt es eine Spring-Dienstprogrammmethode, die den Klassentyp in einen String mit einem niedrigeren ersten Buchstaben konvertiert? Dadurch kann ich den Klassennamen sicher umgestalten.

Zum Beispiel:

SpringXXX.defaultBeanNameYYY(MyCustomBeanFactoryProcessor.class) 

sollte produzieren:

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; 
     } 
    } 

Und wie folgt aufrufen:

myCustomBeanFactoryProcessor 

Antwort

1

Sie ein, sich so schreiben kann BeanUtils.firstToLowerCase(MyCustomBeanFactoryProcessor.class)

+1

Ich gehe davon aus OP will erreichen, es von Spring Ressourcen, anstatt es manuell zu schreiben. – Andrew

1

Standardmäßig heißt ein Mechanismus, der Bean-Namen bildet, BeanNameGenerator (abhängig vom Typ des Kontextes kann es sich um den AnnotationBeanNameGenerator oder DefaultBeanNameGenerator handeln). Um einen Namen zu erzeugen, erfordert es eine Bohne Definition und einen Kontext, in dem diese Definition von:

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

Zum Beispiel könnten Sie diese Verarbeitung in einem BeanFactoryPostProcessor Unterklasse schreiben, wo ein ConfigurableListableBeanFactory Beispiel gegeben:

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

Schließlich, wenn wir den Kontext und alle Prüfungen wegwarf, dass Frühling der Fall ist, könnten wir nur ausführen:

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

oder

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

Wow! 'Introspector.decapitalize' ist im Standard Java. – gavenkoa

+0

@gavenko, wenn Sie diese Umwandlungen aus Spring machen, ist es wahrscheinlich besser, keine Spring-spezifische Klasse zu verwenden, oder? Ansonsten würde ich empfehlen, die Methode mit dem Kontext und den Definitionen in Betracht zu ziehen. – Andrew

0

Mit getSimpleName Zeichenfolge als Hinweis von @shi für Suchabfrage ich eine solche Implementierung in spring-core/src/main/java/org/springframework/util/ClassUtils.java gefunden:

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

Verbrauch:

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