使用注释创建时,默认情况下如何命名Bean?

DSi*_*kin 2 spring annotations javabeans

我正在使用别人编写的Spring Java代码。我想引用由注释(字段classABC)创建的bean:

@Component
public class ClassService
{
    @Autowired
    ClassABC classABC;

public interface ClassABC

@Repository
public class ClassABCImpl extends BaseABC implements ClassABC
Run Code Online (Sandbox Code Playgroud)

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

ClassABC classABC = ApplicationContext.getBean("classABC");
Run Code Online (Sandbox Code Playgroud)

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

ClassABC classABC = ApplicationContext.getBean(ClassABC.class);
Run Code Online (Sandbox Code Playgroud)

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

注意:没有配置XML引用此bean,因此我认为bean名称不在xml中定义。

小智 10

添加到上面 Darren Forsythe 的答案, AnnotationBeanNameGenerator 的实现可能会导致两种 bean 名称。

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

示例:com.xyz.FooServiceImpl 类名导致 FooServiceImpl 的短名称。由于前两个字符不是大写,因此 bean 名称将变为 -> fooServiceImpl。

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

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

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


Dar*_*the 5

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

是注释的默认bean名称生成器,有一个DefaultBeanNameGenerator用于定义的bean@Bean

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

以具体的服务实现为例, com.xyz.FooServiceImpl -> fooServiceImpl

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

  • Bean 将被命名为`classABCImpl`。不是小`c`。 (2认同)