春天的豆子案例是否具有感知性?

2022-09-02 03:30:29

当我使用getBean("test")

我有一个类像

@Component
public class TEST {
}

这个豆子可以加载吗?


答案 1

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

当组件在扫描过程中被自动检测到时,其 Bean 名称由策略 [...] 生成。默认情况下,任何包含值的 Spring 构造型批注 (、 、 和 ) 都将因此将该名称提供给相应的 Bean 定义。BeanNameGenerator@Component@Repository@Service@Controllername

如果此类批注不包含任何值,或者对于任何其他检测到的组件(如由自定义筛选器发现的组件),则缺省 Bean 名称生成器将返回未大写的非限定类名name

有关 / 请参阅 4.12.4.5 自定义 Bean 命名@Configuration@Bean

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

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

getBean("TEST")

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

getBean("test")

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

[...]例如,如果检测到以下两个组件,则名称将为 和 :myMovieListermovieFinderImpl

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

@Repository
public class MovieFinderImpl implements MovieFinder {
  // ...
}

答案 2

@Component默认情况下,注释使用,如果未显式指定名称,则将使用 Bean ClassName 上的方法获取 Bean 的名称。通常,名称为“Test”的类会给它一个豆子名称“test”。但有一个好奇心:AnnotationBeanNameGeneratorIntrospector.decapitalize()decapitalize

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

所以你会得到豆子的名字。class TESTTEST


推荐