2012-06-10 7 views

risposta

15

getBean()è maiuscole e minuscole, tuttavia Spring usa strategia di denominazione di fagioli personalizzato per @Component e @Bean classi. Vedere 4.10.5 Naming autodetected components:

Quando un componente viene riconosciuto automaticamente come parte del processo di scansione, il suo nome di fagioli è generato dal BeanNameGenerator strategia [...]. Per impostazione predefinita, qualsiasi annotazione stereotipo Spring (@Component, , @Service e @Controller) che contiene un valore name fornirà quindi tale nome alla definizione di bean corrispondente.

Se tale annotazione non contiene alcun valore name o per qualsiasi altro componente rilevato (come quelli scoperti da filtri personalizzati), il generatore di nomi di fagioli predefinita restituisce l'in minuscolo non qualificato nome della classe.

E per @Configuration/@Bean vedere 4.12.4.5 Customizing bean naming:

Per impostazione predefinita, le classi di configurazione utilizzare il nome di un metodo di @Bean come il nome del chicco risultante. Questa funzionalità può essere sostituita, tuttavia, con l'attributo name.

Torna alla tua domanda. Perché la classe non segue le convenzioni Java di denominazione (nomi di cammello e minuscole) Spring usa nome insolito per il fagiolo, questo funzionerà:

getBean("TEST") 

Tuttavia, se si utilizza la denominazione prevista (@Component class Test { }), è necessario utilizzare minuscole identificatori:

getBean("test") 

Inoltre se il nome è più complesso, si applica la sintassi cammello caso in minuscolo (continuando a citare il Spring documentation):

[...] Ad esempio, se sono stati rilevati i seguenti due componenti, i nomi sarebbero myMovieLister e movieFinderImpl:

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

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

Grazie Tomasz. È più complesso delle mie aspettative. Se la mia classe è qualcosa di simile alla classe @Component TestTree, posso usare getBean ("testTree") per caricarlo? – user496949

+0

@ user496949: esattamente. In realtà non è complesso. Probabilmente useresti lo stesso nome per una variabile che contiene una classe di tipo 'TestTree'. Inoltre, al giorno d'oggi dovresti usare 'getBean (TestTree.class ') staticamente digitato –

3

@Component annotazione utilizza AnnotationBeanNameGenerator di default che, se non in modo esplicito un nome, utilizzerà Introspector.decapitalize() metodo sul bean ClassName per ottenere un nome per il bean. Normalmente una classe con un nome come "Test" gli darà il nome di fagiolo "test".Ma decapitalize ha una curiosità:

Ciò normalmente significa convertire il primo carattere da maiuscolo a minuscole, ma nel (inusuale) caso particolare in cui v'è più di un carattere e entrambi il primo ed il secondo carattere sono maiuscole, lasciamo stare.

Così il vostro class TEST riceverà il nome del bean TEST.