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