当我使用getBean("test")
我有一个像
这样的课程@Component
public class TEST {
}
可以加载这个bean吗?
答案 0 :(得分:19)
getBean()
区分大小写,但Spring对@Component
和@Bean
类使用自定义bean命名策略。见4.10.5 Naming autodetected components:
当组件作为扫描过程的一部分自动检测时,其bean名称由
BeanNameGenerator
策略生成[...]。默认情况下,任何包含@Component
值的Spring构造型注释(@Repository
,@Service
,@Controller
和name
)都会将该名称提供给相应的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):
[...]例如,如果检测到以下两个组件,则名称将为
myMovieLister
和movieFinderImpl
:
@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
。