Spring getbean是否区分大小写?

时间:2012-06-10 08:23:56

标签: java spring

当我使用getBean("test")

我有一个像

这样的课程
@Component
public class TEST {
}

可以加载这个bean吗?

2 个答案:

答案 0 :(得分:19)

getBean() 区分大小写,但Spring对@Component@Bean类使用自定义bean命名策略。见4.10.5 Naming autodetected components

  

当组件作为扫描过程的一部分自动检测时,其bean名称由BeanNameGenerator策略生成[...]。默认情况下,任何包含@Component值的Spring构造型注释(@Repository@Service@Controllername)都会将该名称提供给相应的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 {
  // ...
}

答案 1 :(得分:3)

@Component注释默认使用AnnotationBeanNameGenerator,如果没有明确给出名称,将使用bean ClassName上的Introspector.decapitalize()方法获取bean的名称。通常,名为“Test”的类将为其提供bean名称“test”。但decapitalize有好奇心:

  

这通常意味着将第一个字符从大写转换为   小写,但在(异常)特殊情况下,当有超过   一个字符,第一个和第二个字符都是大写字母,   我们不管它。

因此,您的class TEST将获得bean名称TEST