当我使用getBean("test")
我有一个像
@Component
public class TEST {
}
这个bean可以加载吗?
getBean()
区分大小写,但是 Spring 对@Component
和@Bean
类使用自定义 bean 命名策略。请参阅4.10.5 命名自动检测到的组件:
当一个组件作为扫描过程的一部分被自动检测时,它的 bean 名称由
BeanNameGenerator
策略生成 [...]。默认情况下,任何包含值的 Spring 原型注解(@Component
、@Repository
、@Service
和)都将因此将该名称提供给相应的 bean 定义。@Controller
name
如果这样的注释不包含任何
name
值或任何其他检测到的组件(例如由自定义过滤器发现的组件),则默认 bean 名称生成器将返回未大写的非限定类名称。
对于@Configuration
/@Bean
参见4.12.4.5 自定义 bean 命名:
默认情况下,配置类使用
@Bean
方法的名称作为生成的 bean 的名称。但是,可以使用name
属性覆盖此功能。
回到你的问题。因为您的类没有遵循 Java 命名约定(驼峰命名),所以 Spring 为 bean 使用了不寻常的名称,这将起作用:
getBean("TEST")
但是,如果您使用预期@Component class Test { }
的命名 ( ),则必须使用小写标识符:
getBean("test")
此外,如果您的名字更复杂,则适用未大写的驼峰式语法(继续引用Spring 文档):
[...] 例如,如果检测到以下两个组件,则名称将是
myMovieLister
andmovieFinderImpl
:
@Service("myMovieLister")
public class SimpleMovieLister {
// ...
}
@Repository
public class MovieFinderImpl implements MovieFinder {
// ...
}
@Component
注释AnnotationBeanNameGenerator
默认使用,如果没有明确给出名称,将使用Introspector.decapitalize()
bean ClassName 上的方法来获取 bean 的名称。通常,名称如“Test”的类会给它 bean 名称“test”。但decapitalize
有一个好奇心:
这通常意味着将第一个字符从大写转换为小写,但是在(不寻常的)特殊情况下,当有多个字符并且第一个和第二个字符都是大写时,我们不理会它。
所以你class TEST
会得到 bean name TEST
。