2012-06-10 30 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