21

当我使用getBean("test")

我有一个像

@Component
public class TEST {
}

这个bean可以加载吗?

4

2 回答 2

24

getBean() 区分大小写,但是 Spring 对@Component@Bean类使用自定义 bean 命名策略。请参阅4.10.5 命名自动检测到的组件

当一个组件作为扫描过程的一部分被自动检测时,它的 bean 名称由BeanNameGenerator策略生成 [...]。默认情况下,任何包含值的 Spring 原型注解( @Component@Repository@Service和)都将因此将该名称提供给相应的 bean 定义。@Controllername

如果这样的注释不包含任何name值或任何其他检测到的组件(例如由自定义过滤器发现的组件),则默认 bean 名称生成器将返回未大写的非限定类名称

对于@Configuration/@Bean参见4.12.4.5 自定义 bean 命名

默认情况下,配置类使用@Bean方法的名称作为生成的 bean 的名称。但是,可以使用name属性覆盖此功能。

回到你的问题。因为您的类没有遵循 Java 命名约定(驼峰命名),所以 Spring 为 bean 使用了不寻常的名称,这将起作用:

getBean("TEST")

但是,如果您使用预期@Component class Test { }的命名 ( ),则必须使用小写标识符:

getBean("test")

此外,如果您的名字更复杂,则适用未大写的驼峰式语法(继续引用Spring 文档):

[...] 例如,如果检测到以下两个组件,则名称将是myMovieListerand movieFinderImpl

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

@Repository
public class MovieFinderImpl implements MovieFinder {
  // ...
}
于 2012-06-10T08:46:12.323 回答
11

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

这通常意味着将第一个字符从大写转换为小写,但是在(不寻常的)特殊情况下,当有多个字符并且第一个和第二个字符都是大写时,我们不理会它。

所以你class TEST会得到 bean name TEST

于 2013-03-15T07:06:47.263 回答