是春天getbean案件是否传染?

use*_*949 16 java spring

我用的时候 getBean("test")

我有一个类似的课程

@Component
public class TEST {
}
Run Code Online (Sandbox Code Playgroud)

可以加载这个bean吗?

Tom*_*icz 20

getBean() 大小写敏感的,但是Spring使用自定义的bean命名策略@Component@Bean类.请参见4.10.5命名自动检测的组件:

当组件作为扫描过程的一部分自动检测时,其bean名称由BeanNameGenerator策略生成[...].默认情况下,任何Spring刻板印象注释(@Component,@Repository,@Service,和@Controller包含)name值,从而提供名字相应的bean定义.

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

并且@Configuration/ @Bean请参阅4.12.4.5自定义bean命名:

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

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

getBean("TEST")
Run Code Online (Sandbox Code Playgroud)

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

getBean("test")
Run Code Online (Sandbox Code Playgroud)

此外,如果您的名称更复杂,则应用非大写的camel-case语法(继续引用Spring文档):

[...]例如,如果检测到下面的两种成分,名称将是myMovieListermovieFinderImpl:

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

@Repository
public class MovieFinderImpl implements MovieFinder {
  // ...
}
Run Code Online (Sandbox Code Playgroud)


ver*_*tti 5

@ComponentAnnotationBeanNameGenerator默认情况下,注释使用(如果未显式指定名称)将使用Introspector.decapitalize()Bean ClassName上的方法来获取Bean的名称。通常,名称为“ Test”的类将为它提供bean名称“ test”。但decapitalize有一个好奇心:

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

这样您class TEST将获得bean名称TEST