2012-06-10 56 views

回答

15

getBean()大小寫敏感的,但是Spring使用定製的bean命名策略@Component@Bean類。見4.10.5 Naming autodetected components

當組件被自動檢測作爲掃描過程的一部分,由BeanNameGenerator策略生成​​bean名稱[...]。默認情況下,包含name值的任何Spring原型註釋(@Component,@Repository,@Service@Controller)都會將該名稱提供給相應的bean定義。

如果這樣的註釋不包含name值或用於任何其他檢測到的成分(如那些由自定義過濾器發現),則默認bean名稱發生器返回小寫形式非限定類名

而對於@Configuration/@Bean看到4.12.4.5 Customizing bean naming

默認情況下,配置類使用@Bean方法的名稱所產生的bean的名字。但是,此功能可以被覆蓋,name屬性。

回到你的問題。因爲你的類沒有下面的Java命名約定(駝峯名)Spring使用不同尋常的名字爲bean,這將工作:

getBean("TEST") 

但是如果你使用的預期命名(@Component class Test { }),您必須使用小寫標識符:

getBean("test") 

此外,如果你的名字是比較複雜的,小寫形式駝峯語法適用(繼續引用Spring documentation):

[...]例如,如果檢測到下面的兩個組成部分,名字是myMovieListermovieFinderImpl

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

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

感謝Tomasz。這比我的期望更復雜。如果我的類是類似@Component類的TestTree,我可以使用getBean(「testTree」)加載它嗎? – user496949

+0

@ user496949:正好。其實這並不複雜。您可能會使用同一個名稱來存放一個類型爲「TestTree」的變量。此外,你現在應該使用靜態類型的'getBean(TestTree.class)' –

3

@Component註釋默認情況下,如果沒有明確給出一個名稱,將使用Introspector.decapitalize()方法對bean使用AnnotationBeanNameGenerator ClassName獲取bean的名稱。通常,名稱類似「Test」的類將給它一個bean名稱「test」。但decapitalize具有好奇心:

這通常意味着從上部殼體小寫轉換的第一個字符到 ,但在(異常)的特殊情況下,當存在多於 一個字符,所述第一和第二字符大寫, 我們保持獨立。

所以你的class TEST將得到豆名TEST