【问题标题】:How are beans named by default when created with annotation?使用注解创建 bean 时,默认情况下如何命名?
【发布时间】:2018-07-30 00:28:52
【问题描述】:

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

@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”。这个豆子叫什么名字?

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

【问题讨论】:

    标签: java spring annotations javabeans


    【解决方案1】:

    添加到上面 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 名称时只查看短名称及其前两个字符。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • Bean 将被命名为classABCImpl。不是小c
      • 感谢@ShaneCoder,复制粘贴失败:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多