2012-06-10 7 views

Respuesta

15

getBean()es entre mayúsculas y minúsculas, sin embargo primavera utiliza la estrategia de nomenclatura de frijol a medida para @Component y @Bean clases. Ver 4.10.5 Naming autodetected components:

Cuando un componente, es detectado como parte del proceso de análisis, su nombre frijol es generado por el BeanNameGenerator estrategia [...]. De forma predeterminada, cualquier anotación de estereotipo de primavera (@Component, @Repository, @Service y @Controller) que contiene un valor name proporcionará ese nombre a la definición de bean correspondiente.

Si una anotación tal contiene ningún valor name o por cualquier otro componente detectado (como los descubiertos por filtros personalizados), el generador de nombres de frijol por defecto devuelve el nombre de la clase no cualificado en minúsculas.

Y para @Configuration/@Bean ver 4.12.4.5 Customizing bean naming:

Por defecto, las clases de configuración usar el nombre de un método @Bean como el nombre del grano resultante. Sin embargo, esta funcionalidad puede anularse con el atributo name.

Volver a tu pregunta. Debido a que su clase no está siguiendo las convenciones de nombres de Java (nombres de camello caso) Primavera utiliza nombre inusual para el grano, esto va a funcionar:

getBean("TEST") 

Sin embargo, si se utiliza nombres esperado (@Component class Test { }), debe utilizar minúsculas identificadores:

getBean("test") 

Por otra parte, si su nombre es más compleja, se aplica la sintaxis de camello caso en minúsculas (continuando por citar el Spring documentation):

[...] Por ejemplo, si se detectaron los siguientes dos componentes, los nombres serían myMovieLister y movieFinderImpl:

@Service("myMovieLister") 
public class SimpleMovieLister { 
    // ... 
} 

@Repository 
public class MovieFinderImpl implements MovieFinder { 
    // ... 
} 
+0

Gracias Tomasz. Es más complejo de lo que esperaba. Si mi clase es algo así como @Component class TestTree, ¿puedo usar getBean ("testTree") para cargarlo? – user496949

+0

@ user496949: exactamente. En realidad, no es complejo. Probablemente usaría el mismo nombre para una variable que contenga una clase de tipo 'TestTree'. Además, debería usar 'getBean (TestTree.class)' estáticamente tipeado 'hoy en día –

3

@Component anotación utiliza AnnotationBeanNameGenerator de forma predeterminada que, si no se da explícitamente un nombre, utilizará Introspector.decapitalize() método en el bean ClassName para obtener un nombre para el bean. Normalmente, una clase con un nombre como "Test" le dará el nombre "prueba".Pero decapitalize tiene una curiosidad:

Esto normalmente significa convertir el primer carácter de mayúsculas a minúsculas, pero en el caso especial (inusual) cuando no es más que un personaje y el primer y segundo caracteres son mayúsculas, lo dejamos solo.

De modo que su class TEST recibirá el nombre de bean TEST.

Cuestiones relacionadas