2012-06-10 13 views

Odpowiedz

15

getBean()jest wielkość liter, jednak wiosna używa niestandardowej strategii nazewnictwa fasoli dla @Component i @Bean klas. Zobacz 4.10.5 Naming autodetected components:

Gdy składnik jest wykrywana jako część procesu skanowania, jego nazwa fasoli są generowane przez strategię BeanNameGenerator [...]. Domyślnie każda adnotacja z wiosennym stereotypem (@Component, @Repository, i @Controller), która zawiera wartość name, dostarczy tę nazwę do odpowiedniej definicji komponentu bean.

Jeśli taka adnotacja zawiera żadnej wartości name lub w jakimkolwiek innym wykrytego składnika (takie jak te odkryte przez filtry niestandardowe), to Domyślna nazwa fasola generator zwraca uncapitalized zakaz nazwę klasy.

I @Configuration/@Bean zobaczyć 4.12.4.5 Customizing bean naming:

Domyślnie klas konfiguracji używać nazwy danego @Bean metodę jako nazwę wynikowego fasoli. Funkcję tę można jednak zastąpić atrybutem name.

Powrót do pytania. Ponieważ klasa nie obserwuje nazewnictwa Java (nazwy camel-CASE) Wiosna wykorzystuje niezwykłą nazwę fasoli, to będzie działać:

getBean("TEST") 

Jednak jeśli używasz oczekiwaną nazewnictwa (@Component class Test { }), należy użyć małymi literami identyfikatory:

getBean("test") 

Ponadto jeśli nazwa jest bardziej złożone, dotyczy uncapitalized składnia wielbłądziej przypadek (kontynuując zacytować Spring documentation):

[...] Na przykład, jeśli wykryto następujące dwa elementy, nazwy byłoby myMovieLister i movieFinderImpl:

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

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

Dzięki Tomasz. Jest bardziej skomplikowany niż moje oczekiwania. Jeśli moja klasa jest podobna do klasy TestTree klasy @Component, czy mogę użyć getBean ("testTree"), aby ją załadować? – user496949

+0

@ user496949: dokładnie. W rzeczywistości nie jest to skomplikowane. Prawdopodobnie użyjesz tej samej nazwy dla zmiennej posiadającej klasę typu "TestTree". Ponadto powinieneś używać statycznie wpisanego 'getBean (TestTree.class)' obecnie –

3

@Component adnotacja wykorzystuje AnnotationBeanNameGenerator domyślnie, które, jeśli nie są wyraźnie podane nazwisko, użyje Introspector.decapitalize() metodę na fasoli ClassName, aby uzyskać nazwę komponentu bean. Zwykle klasa o nazwie "Test" nadaje jej nazwę "test".Ale decapitalize ma ciekawość:

zwykle oznacza to przekształcenie pierwszego znaku od górnej przypadku do małe litery, ale w (nietypowy) szczególnym przypadku, gdy istnieje więcej niż jeden znak i zarówno pierwszy jak i drugi znaków są duże litery, zostawiamy to w spokoju.

Twój class TEST otrzyma nazwę fasoli TEST.

Powiązane problemy