使用注释创建的 bean 默认情况下如何命名?

How are beans named by default when created with annotation?

我正在使用 Spring java 其他人编写的代码。我想引用一个由注释创建的 bean(字段类 ABC):

@Component
public class ClassService
{
    @Autowired
    ClassABC classABC;

public interface ClassABC

@Repository
public class ClassABCImpl extends BaseABC implements ClassABC

以下代码尝试按名称获取对 ClassABC bean 的引用,但不起作用:

ClassABC classABC = ApplicationContext.getBean("classABC");

但是,以下按类型引用此 bean 的代码确实有效:

ClassABC classABC = ApplicationContext.getBean(ClassABC.class);

因为第一个引用不起作用,我猜测该 bean 没有命名 "classABC"。这个豆子叫什么名字?

注意:没有配置 xml 引用这个 bean,所以我认为 bean 名称没有在 xml 中定义。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/AnnotationBeanNameGenerator.html

是注解的默认bean名称生成器,@Bean

定义的bean有一个DefaultBeanNameGenerator

在这种情况下,我相信 bean 的名称将是 classABCImpl,因为它是由 class 的短名称构建的。

从具体服务实现的例子来看, com.xyz.FooServiceImpl -> fooServiceImpl

如果您想要通过名称引用该 bean,就我个人而言,我不喜欢使用默认命名。在这些情况下最好明确。

添加到上面 Darren Forsythe 的回答中,AnnotationBeanNameGenerator 的实现可以产生两种 bean 名称。

如果从 class 名称派生的短名称以两个大写字符开头,则短名称将成为 bean 名称。 否则,如果短名称的前两个字符之一是小写,bean 名称将是第一个字符小写的短名称。

示例: com.xyz.FooServiceImpl class name 导致 FooServiceImpl 的简称。因为前两个字符不是大写,所以 bean 名称将变为 -> fooServiceImpl.

但是,如果 class 名称是 com.xyz.FOoServiceImpl,这导致了 FOoServiceImpl 的短名称,您的 bean 名称将保留为 FOoServiceImpl,因为前两个字符是大写的。

同样,com.xyz.FOoServiceIMPL,将导致 bean 名称为 FOoServiceIMPL。

Spring 在创建 bean 名称时只查看短名称及其前两个字符。