如何通过注释在 Spring 中按名称自动装配?

How to autowire by name in Spring with annotations?

我定义了几个相同 class 的 bean:

  @Bean
  public FieldDescriptor fullSpotField() {
     FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
     return ans;
  }

  @Bean
  public FieldDescriptor annotationIdField() {
     FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
     return ans;
  }

因此当我自动装配它们时

   @Autowired
   public FieldDescriptor fullSpotField;

   @Autowired
   public FieldDescriptor annotationIdField;

我遇到异常

NoUniqueBeanDefinitionException: No qualifying bean of type [...FieldDescriptor] is defined: expected single matching bean but found ...

如何在 XML 配置中尽可能按名称自动装配?

可以用@Qualifier来解决

在您的情况下,您可以:

 @Bean(name="fullSpot")
 // Not mandatory. If not specified, it takes the method name i.e., "fullSpotField" as qualifier name.
  public FieldDescriptor fullSpotField() {
     FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
     return ans;
  }

  @Bean("annotationIdSpot")
  // Same as above comment.
  public FieldDescriptor annotationIdField() {
     FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
     return ans;
  }

随后您可以使用以下方式注入:

   @Autowired
   @Qualifier("fullSpot")
   public FieldDescriptor fullSpotField;

   @Autowired
   @Qualifier("annotationIdSpot")
   public FieldDescriptor annotationIdField;

这是一个非常简单的“按名称自动装配”的例子 beans 自己注册到容器中,但在按名称使用自动装配时可能需要构造函数注入。

你可以继续这样试试, 你在哪里自动装配上面指定的 2 个 bean,

class ExampleClass {
    @Autowired
    public FieldDescriptor fullSpotField;

    @Autowired
    public FieldDescriptor annotationIdField;

    public ExampleClass(FieldDescriptor fullSpotField,FieldDescriptor annotationIdField ){
        super();
        this.fullSpotField = fullSpotField;
        this.annotationIdField = annotationIdField;
    }
}